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

时间:2014-06-05 19:41:56

标签: sql spring hibernate jpa spring-data-jpa

有没有办法从查询中检索最后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个结果?

5 个答案:

答案 0 :(得分:13)

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

public interface UserRepository extends Repository<User, Long> {

   List<User> findFirst10ByUsername(String username);
}

查看 - Spring Data Release Train Evans Goes GA

答案 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);