JPQL 中的 LIMIT 子句替代方案是什么?

新手上路,请多包涵

我正在使用在 JPQL 中实现的 PostgreSQL 查询。

这是一个运行良好的示例本机 psql 查询,

 SELECT * FROM students ORDER BY id DESC LIMIT 1;

JPQL 中的相同查询不起作用,

 @Query("SELECT s FROM Students s ORDER BY s.id DESC LIMIT 1")

Students getLastStudentDetails();

好像 LIMIT 子句在 JPQL 中不起作用。

根据 JPA 文档,我们可以使用 setMaxResults/setFirstResult ,谁能告诉我如何在上面的查询中使用它?

原文由 Madhu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

您使用的 JPQL 不支持这样的限制结果。使用原生 JPQL 时,您应该使用 setMaxResults 来限制结果。

但是,您使用的是 Spring Data JPA,这基本上使它很容易做到。请参阅参考指南中的 此处,了解如何根据查询限制结果。在您的以下情况下, find 方法将完全按照您的要求进行。

 findFirstByOrderById();

您还可以在查询中使用 Pageable 参数,而不是 LIMIT 子句。

 @Query("SELECT s FROM Students s ORDER BY s.id DESC")
List<Students> getLastStudentDetails(Pageable pageable);

然后在您的调用代码中执行类似 操作(如参考指南中所述)。

 getLastStudentDetails(PageRequest.of(0,1));

两者都应该产生相同的结果,而无需求助于普通 SQL。

原文由 M. Deinum 发布,翻译遵循 CC BY-SA 4.0 许可协议

如评论中所述,JPQL 不支持 LIMIT 关键字。

您可以使用 setMaxResults 实现,但如果您想要的只是一个项目,则使用 getSingleResult - 如果找不到任何项目,它会抛出异常。

因此,您的查询将类似于:

 TypedQuery<Student> query = entityManager.createQuery("SELECT s FROM Students s ORDER BY s.id DESC", Student.class);
query.setMaxResults(1);

如果要设置特定的起始偏移量,请使用 query.setFirstResult(initPosition) ;也

原文由 dazito 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题