Spring Data JPA Java - 从查询中获取最近10条记录

hea*_*ock 6 sql spring hibernate jpa spring-data-jpa

有没有办法从查询中检索最后X个结果?

例如 - 如果想要前十个结果,我看到这里的例子有效:Spring-Data-JPA注释的setMaxResults?

 public interface UserRepository extends Repository<User, Long> {

       List<User> findByUsername(String username, Pageable pageable);
 }
 //and then I could call it like this
 Pageable topTen = new PageRequest(0, 10);
 List<User> result = repository.findByUsername("Matthews", topTen);
Run Code Online (Sandbox Code Playgroud)

但是如何获得最后十条记录呢?

我能想到的唯一方法就是翻转查询中的顺序(findByUsernameDesc,假设原始结果是升序的),然后向后遍历列表,这样我就可以按照我想要的顺序(升序)处理它.

这似乎是一种丑陋的方式.有没有办法让查询按我想要的顺序给我最后的X结果?

Raf*_*cha 14

Spring Data JPA 1.7在派生查询中引入了"top"和"first"作为关键字,所以现在我们可以这样做:

public interface UserRepository extends Repository<User, Long> {

   List<User> findFirst10ByUsername(String username);
}
Run Code Online (Sandbox Code Playgroud)

检查出来 - Spring Data Release Train Evans Goes GA


小智 7

PageRequest对它非常有用.构建PageRequest有很多选项.

所以,可能的选择是:

Pageable topTen = new PageRequest(0, 10, Direction.ASC, "username"); 
List<User> result = repository.findByUsername("Matthews", topTen);
Run Code Online (Sandbox Code Playgroud)

我也使用没有参数(关于对象的条件).

@Query(value="select p from Person p")
public List<Person> findWithPageable(Pageable pageable);
Run Code Online (Sandbox Code Playgroud)

并致电:

repository.findWithPageable(new PageRequest(0, 10, Direction.DESC, "id"));
Run Code Online (Sandbox Code Playgroud)


Vla*_*cea 4

问题是这种选择的效率如何,尤其是针对大型数据集。

我会选择降序索引,我可以使用 maxResult 支持进行查询,正如您已经弄清楚的那样。

这绝不是黑客行为。如果您要匹配 100M 个结果,仅获取最后 X 个结果,则此方法将产生最佳结果。