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

2022-08-31 11:02:04

我正在使用在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


答案 1

您正在使用JPQL,它不支持这样的限制结果。使用本机 JPQL 时,应使用来限制结果。setMaxResults

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

findFirstByOrderById();

还可以对查询使用参数而不是子句。PageableLIMIT

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

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

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

两者都应该产生相同的结果,而无需诉诸纯SQL。


答案 2

如注释中所述,JPQL 不支持关键字。LIMIT

您可以使用 来实现这一点,但是如果您想要的只是单个项目,则使用 - 如果未找到任何项目,它将引发异常。setMaxResultsgetSingleResult

因此,您的查询将如下所示:

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

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


推荐