【问题标题】:Hibernate : How to get last n rows in spring boot JpaRepository?Hibernate:如何在 Spring Boot JpaRepository 中获取最后 n 行?
【发布时间】:2019-07-03 09:05:42
【问题描述】:

我正在使用 spring boot 和 jpa 存储库,我想使用 hql 查询从数据库中获取最后 2 条记录。 我已经编写了以下查询,但它不起作用。

@Query("select news from(select news from NewsDTO news order by news.newsId desc limit 2) sub order by news.newsId asc")

它正在抛出以下异常

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: ( near line 1, column 17 [select news from(select news from com.mer.aigs.dto.news.NewsDTO news order by news.newsId desc limit 2) sub order by news.newsId asc]

【问题讨论】:

  • 不工作的意思是它给出错误的结果还是根本没有运行??
  • 你的意思是JPQL无效的“查询”?想知道“不工作”是什么意思......
  • 运行项目时报错

标签: java sql spring spring-data-jpa jpql


【解决方案1】:

JPQL 本身不支持LIMIT 子句。但是,使用 Spring Data JPA,您可以使用 ORDER BY .. DESCPageable 的组合来实现你想要的。有关详细信息,请参阅此https://www.logicbig.com/tutorials/spring-framework/spring-data/pagination.html

【讨论】:

    【解决方案2】:

    limit 关键字不受 hql 支持(甚至在不同的数据库中也不同)。您需要使用实体管理器创建Query 并指定最大尺寸:

    em.createQuery("your query").setMaxResults(2).getResultList()
    

    假设您注入了实体管理器:

    @Autowired
    private EntityManager em
    

    此解决方案的性能比使用Pageable 更好。

    【讨论】:

    • 对不起,他使用的是 Spring Data,所以不需要直接使用实体管理器。
    • Andronicus 感谢您的回答,但我正在使用 Jparepostory 我如何在这里使用 EntityManager 的 createQuery ???
    • @Alan Hay 是的,但他已经在 jpql 中有查询。 @Merwais Muafaq - 答案已写好,您必须 @Autowire 它...
    • 这解决了您的问题吗?如果是,则考虑支持/标记为正确,如果不是 - 继续讨论。
    【解决方案3】:

    正如@Kedar 所述,由于特定于数据库的性质,您不能在 JPQL 查询中使用 LIMIT。因此您需要使用NATIVE QUERY 并替换NewsDTOnewsId 的物理表名和列名:

    @Query(value = "select news from(select news from *NewsDTO* news order by *newsId* desc limit 2) sub order by *newsId* asc", nativeQuery = true)
    

    【讨论】:

      【解决方案4】:

      这对我有用,其中created 是表中的时间戳列:

      repository.findAll(PageRequest.of(0, 2, Sort.by("created").descending())))
      

      就我而言,我希望结果按created 列排序。

      希望这对某人有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-17
        • 2022-01-12
        • 2020-08-22
        • 2013-01-17
        • 2017-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多