使用 Spring Data JPA 和 @Query 注释仅获取第一个/最后一个元素

Posted

技术标签:

【中文标题】使用 Spring Data JPA 和 @Query 注释仅获取第一个/最后一个元素【英文标题】:Fetching only first/last element using Spring Data JPA and @Query annotation 【发布时间】:2015-12-04 05:54:20 【问题描述】:

编辑:关于这个问题的第二个和第四个答案提供了这个问题的解决方案setMaxResults for Spring-Data-JPA annotation?

目标:使用 Spring Data JPA 存储库和 Spring Query 注释按属性 z 获取最大/最小元素。

目前为止我所拥有的

@Query("SELECT xelement FROM x xelement ORDER BY xelement.z")
public List<X> findFirstElement();

问题:此查询获取所有元素(这并不是真正有效)。如果我直接使用 EntityManager,我可以使用

设置结果数
entityManager.setMaxResults(1)

只获取第一个元素。

问题:如何使用 @Query 注释指定最大结果数?

想法:使用大小为 0 的 PageRequest 是否可行?

约束:我知道“FindFirstBy....”查询功能,但我想/必须使用 @Query 注释。

【问题讨论】:

为什么你的方法只返回一个元素时返回List&lt;X&gt;?如果查询真的那么简单,您可以避免使用@Query,而只需使用findFirstOrderByZ()。否则,您将不得不使用 LIMIT 关键字来限制返回的记录数 SELECT x FROM xelement x ORDER BY x.z LIMIT 1 @manish: 1. 关于 List,这只是为了足够灵活,以防我切换任意数量的项目,但是是的,原则上你是正确的,返回一个列表在这种情况下是矫枉过正的。 2.关于“findFirst..” --> 见约束。 3. 你确定 JPQL 中有 limit 关键字吗?我想我必须检查一下......我还找到了***.com/questions/9314078/…,它几乎解决了这个问题。 发现这被 [***.com/questions/9314078/… [1] 中的第二个和第四个答案所涵盖:***.com/questions/9314078/… setMaxResults for Spring-Data-JPA annotation?的可能重复 请不要按列表中的顺序引用答案。 此顺序更改。请直接链接到答案。 【参考方案1】:

你可以通过在@Query注解中添加nativeQuery来使用sql的limit属性。但是,还有另一种更好的方法可以做到这一点。存储库方法中的可分页类将解决您的问题,而无需触及您的 @Query 注释:

@Query(value = "SELECT xelement FROM x xelement ORDER BY xelement.z")
List<X> findFirstElement(Pageable limit);

要设置限制和偏移量,使用应该调用这个存储库方法如下:

List<X> xValues = xRepository.findFirstElement(new PageRequest(0, 1));

这里1对应你想要的限制。

更新(春季数据 2.0)

使用 PageRequest.of(0, 1) 而不是 new PageRequest(0, 1)

【讨论】:

从 spring-data 2.0 开始,它是 PagaRequest.of(0, 1) 而不是 new PageRequest(0, 1) 函数中的参数应该是findFirstElement(PageRequest limit)而不是Pageable吧?至少对我来说,它不适用于 Pageable。【参考方案2】:

我能想到的最适合您的用例的 JPA 查询语法是 findFirstByZIsNotNullOrderByZAsc。这应该消除编写自定义本机查询的需要。

【讨论】:

【参考方案3】:

尝试这样做:

@Query(value = "SELECT xelement FROM x xelement ORDER BY xelement.z  LIMIT 1",
       nativeQuery = true)

【讨论】:

它只是不起作用。 U 在原生查询和 JPQL 语法之间混合使用。

以上是关于使用 Spring Data JPA 和 @Query 注释仅获取第一个/最后一个元素的主要内容,如果未能解决你的问题,请参考以下文章

处理 JPA 规范和 spring-data-jpa 时如何使用声明 Stream 作为返回类型

spring data jpa 详解

Maven 使用 spring-data-jpa 和 querydsl 构建问题

使用 spring-data-jpa 和 spring-mvc 过滤数据库行

Spring Data 系列 Spring+JPA(spring-data-commons)

无法将 Spring Data MongoDB + Spring Data JPA 与 Spring Boot 一起使用