使用 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<X>
?如果查询真的那么简单,您可以避免使用@Query
,而只需使用findFirstOrderByZ()
。否则,您将不得不使用 LIMIT
关键字来限制返回的记录数 SELECT x FROM xelement x ORDER BY x.z LIMIT 1
。
@manish: 1. 关于 List你可以通过在@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 作为返回类型
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 一起使用