有没有办法从查询中检索最后X个结果?
例如 - 如果想要前十个结果,我看到此处的示例有效:setMaxResults for Spring-Data-JPA annotation?
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);
但我如何获得最后十条记录?
我能想到的唯一方法是翻转查询中的顺序(findByUsernameDesc,假设原始结果是提升的),然后向后遍历列表,这样我就可以按照我想要的顺序处理它(升序) 。
这似乎是一种丑陋的方式。有没有办法让查询按我想要的顺序给我最后的X个结果?
答案 0 :(得分:13)
Spring Data JPA 1.7在派生查询中引入了“top”和“first”作为关键字,所以现在我们可以这样做:
public interface UserRepository extends Repository<User, Long> {
List<User> findFirst10ByUsername(String username);
}
答案 1 :(得分:6)
PageRequest对它非常有用。构建PageRequest有很多选项。
所以,可能的选择是:
Pageable topTen = new PageRequest(0, 10, Direction.ASC, "username");
List<User> result = repository.findByUsername("Matthews", topTen);
我也使用不带参数(关于对象的条件)。
@Query(value="select p from Person p")
public List<Person> findWithPageable(Pageable pageable);
并致电:
repository.findWithPageable(new PageRequest(0, 10, Direction.DESC, "id"));
答案 2 :(得分:2)
问题在于选项的效率如何,特别是针对大型数据集。
我会选择降序索引,我可以使用maxResult支持查询,因为你已经知道了。
这不是一个黑客行为。如果您只匹配100M结果以获得最后的X结果,则此方法将产生最佳结果。
答案 3 :(得分:2)
您可以执行此操作以按用户名过滤最后10条记录:
List<User> findFirst10ByUsernameOrderByIdDesc(String username);
答案 4 :(得分:0)
我能想到的另一种方法(除了先订购),就是获取记录总数,然后使用set max results并设置第一个结果。
我不知道spring-data-jpa,但它也应该在查询上设置firstresult。
// this is a hibernate query... but should be simple
Integer count = (Integer) session.createQuery("select count(*) from ....").uniqueResult();
//Get the last ten
Pageable topTen = new PageRequest(count - 10, count);
List<User> result = repository.findByUsername("Matthews", topTen);