【问题标题】:Fetching only first/last element using Spring Data JPA and @Query annotation使用 Spring Data JPA 和 @Query 注释仅获取第一个/最后一个元素
【发布时间】: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 关键字吗?我想我必须检查一下......我还找到了stackoverflow.com/questions/9314078/…,它几乎解决了这个问题。
  • 发现这被 [stackoverflow.com/questions/9314078/… [1] 中的第二个和第四个答案所涵盖:stackoverflow.com/questions/9314078/…
  • 请不要按列表中的顺序引用答案。 此顺序更改。请直接链接到答案。

标签: java spring spring-data-jpa jpql


【解决方案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 语法之间混合使用。
    猜你喜欢
    • 2014-12-19
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 2013-12-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多