我正在使用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
,任何人都可以告诉我如何在上述查询中使用它?
答案 0 :(得分:35)
您正在使用不支持限制结果的JPQL。使用本机JPQL时,您应使用setMaxResults
来限制结果。
但是,您使用的是Spring Data JPA,这基本上很容易实现。请参阅参考指南中的here,了解如何根据查询限制结果。在您的情况下,find方法可以完全按照您的要求进行操作。
findFirstByOrderById();
您还可以在查询中使用Pageable
参数,而不是LIMIT
子句。
@Query("SELECT s FROM Students s ORDER BY s.id DESC")
List<Students> getLastStudentDetails(Pageable pageable);
然后在您的调用代码中执行类似的操作(参考指南中的here解释)。
getLastStudentDetails(new PageRequest(0,1));
两者都应该产生相同的结果,而不需要求助于纯SQL。
答案 1 :(得分:9)
正如评论中所述,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)
;太
答案 2 :(得分:2)
您不能在Limit
中使用HQL
,因为Limit
取决于数据库供应商,因此Hibernate
不允许通过HQL
查询。
一种实现方式是使用子查询:
@Query("FROM Students st WHERE st.id = (SELECT max(s.id) FROM Students s)")
Students getLastStudentDetails();
答案 3 :(得分:1)
您可以使用以下内容:
@Repository
public interface ICustomerMasterRepository extends CrudRepository<CustomerMaster, String>
{
@Query(value = "SELECT max(c.customer_id) FROM CustomerMaster c ")
public String getMaxId();
}
答案 4 :(得分:1)
对分页(new PageRequest(0, 1)
)进行硬核以仅获取一条记录。
@QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value = "true") })
@Query("select * from a_table order by a_table_column desc")
List<String> getStringValue(Pageable pageable);
您必须通过new PageRequest(0, 1)
才能获取记录,并从列表中获取第一条记录。
答案 5 :(得分:1)
JPQL不允许在HQL生成的查询中添加 limit 关键字。您将收到以下异常。
org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌: LIMIT在第1行附近
但是请不要担心,可以通过以下步骤在HQL生成的查询中使用limit关键字。
Sort.by(sortBy).descending()//以降序获取记录
pageSize = 1 //从降序结果集中获取第一条记录。
请参考以下服务类别
服务:
@Autowired
StudentRepository repository;
public List<Student> getLastStudentDetails(Integer pageNo, Integer pageSize, String sortBy)
{
Integer pageNo = 0;
Integer pageSize = 1;
String sortBy = "id";
Pageable paging = PageRequest.of(pageNo, pageSize, Sort.by(sortBy).descending());
Slice<Student> pagedResult = repository.findLastStudent(paging);
return pagedResult.getContent();
}
您的存储库界面应实现 PagingAndSortingRepository
存储库:
public interface StudentRepository extends JpaRepository<Student,Long>, PagingAndSortingRepository<Student,Long>{
@Query("select student from Student student")
Slice<Student> findLastStudent(Pageable paging);
}
这将为查询添加limit关键字,您可以在控制台中看到它。希望这会有所帮助。
答案 6 :(得分:0)
您好,您可以获取jpql中的单行并使用LIMIT,我们可以告诉jpql它是否是本机查询。
(使用-nativeQuery = true)
以下是用途
@Query("SELECT s FROM Students s ORDER BY s.id DESC LIMIT 1", nativeQuery=true)
Students getLastStudentDetails();