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.
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)
; 太
正确的方法是像这样编写 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)
您不能使用Limit
in,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)
归档时间: |
|
查看次数: |
47794 次 |
最近记录: |