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

Mad*_*dhu 36 java mysql jpa jpql spring-data-jpa

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

这是一个原生的psql查询示例,工作正常,

SELECT * FROM students ORDER BY id DESC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

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

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

Students getLastStudentDetails();
Run Code Online (Sandbox Code Playgroud)

似乎LIMIT子句在JPQL中不起作用.

根据我们可以使用的JPA文档setMaxResults/setFirstResult,任何人都可以告诉我如何在我的上述查询中使用它?

M. *_*num 47

您正在使用不支持限制结果的JPQL.使用本机JPQL时,您应该使用setMaxResults限制结果.

但是,您使用的是Spring Data JPA,这基本上很容易实现.请参见这里了解如何根据查询来限制结果的参考指南中.在您的情况下,find方法将完全按照您的要求执行.

findFirstByOrderById();
Run Code Online (Sandbox Code Playgroud)

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

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

然后在你的调用代码做这样的事情(如解释这里的参考指南中).

getLastStudentDetails(new PageRequest(0,1));
Run Code Online (Sandbox Code Playgroud)

两者都应该产生相同的结果,而不需要求助于纯SQL.

  • new PageRequest(0,1) 对我有用,而不是 new PageableRequest。我正在使用 Spring 1.5.6。JPA 2.1 中有什么变化吗? (2认同)
  • 您的代码无效,因为1)@ Query`中的LIMIT 1和2)getLastStudentDetails具有类型Pageable的参数,但返回单个对象。这将在应用启动时失败(`IllegalStateException:方法必须具有以下返回类型之一![接口org.springframework.data.domain.Slice,接口java.util.List,接口org.springframework.data.domain.Page ]`) (2认同)
  • 新的PageRequest已被弃用。现在使用`PageRequest.of(page,size)` (2认同)

daz*_*ito 11

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

您可以使用setMaxResults但是如果您想要的只是一个项目,那么使用getSingleResult- 如果没有找到项目,它会抛出异常.

所以,你的查询将是这样的:

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

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

  • 不对。如果您的应用程序有数十个实体和数十个使用 Hibernate 或 JPA 完成的查询,并且在维护期间您发现需要转义一次到本机 SQL,为什么不这样做呢? (4认同)
  • 嗨,我用这个也为我工作'@Query(值= "SELECT*FROM学生ORDER BY ID DESC LIMIT 1",nativeQuery = TRUE)对象getLastStudentDetails();` (2认同)
  • ^^ 如果您要使用本机查询,则使用 Hibernate 毫无意义。 (2认同)

NRJ*_*NRJ 9

正确的方法是像这样编写 JPA 接口方法

public interface MyRepository extends PagingAndSortingRepository<EntityClass, KeyClass> {

List<EntityClass> findTop100ByOrderByLastModifiedDesc();
}
Run Code Online (Sandbox Code Playgroud)

在方法名称中,“100”表示您想要多少行,否则您将把这些行放入限制子句中。“LastModified”也是您要排序的列。

PagingAndSortingRepository 或 CrudRepository,两者都适用于此。

为了完整起见,OP的接口方法是

List<Students> findTop1ByIdDesc();
Run Code Online (Sandbox Code Playgroud)


Dav*_*sus 8

您不能使用Limitin,HQL因为Limit它依赖于数据库供应商,因此Hibernate不允许它通过HQL查询。

您可以实现的一种方法是使用子查询:

@Query("FROM Students st WHERE st.id = (SELECT max(s.id) FROM Students s)")
Students getLastStudentDetails();
Run Code Online (Sandbox Code Playgroud)


小智 5

您好,获取单行并在 jpql 中使用 LIMIT 我们可以告诉 jpql 它是否是本机查询。

(使用 - nativeQuery=true )

下面是使用

@Query("SELECT s FROM Students s ORDER BY s.id DESC LIMIT 1", nativeQuery=true)
Students getLastStudentDetails();
Run Code Online (Sandbox Code Playgroud)

  • 现在这是本机 SQL 语句,而不是 JPQL。 (3认同)