Spring Data JPA自定义查询限制功能不起作用[重复]
Posted
技术标签:
【中文标题】Spring Data JPA自定义查询限制功能不起作用[重复]【英文标题】:Spring Data JPA Custom Query limit functionality not working [duplicate] 【发布时间】:2017-10-24 12:11:14 【问题描述】:我创建了一个自定义查询
@Repository
public interface SecurityQuestionRepository extends JpaRepository<SecurityQuestion, Integer>
@Query("select q from SecurityQuestion q order by q.questionId asc limit 0, 3 ")
public List<SecurityQuestion> findQuestion();
当我调用服务并调用公共List<SecurityQuestion> findQuestion()
方法limit 0,3
不起作用
这里是休眠日志,
Hibernate: select securityqu0_.question_id as question1_4_, securityqu0_.question_desc as question2_4_ from user_security_question securityqu0_ order by securityqu0_.question_id asc
如何使此限制功能在此工作?
【问题讨论】:
JPQL 不支持“LIMIT”,因为任何基本的 JPA 文档都会告诉您 由于limit
这个关键字不被少数数据库厂商支持,主要是Oracle,我猜这就是JPQL
中没有包含它的原因。使用Pageable
,可以很方便的转换成ArrayList
...:)
【参考方案1】:
尝试传递Pageable
类型的方法参数:
@Query("select q from SecurityQuestion q order by q.questionId asc")
public List<SecurityQuestion> findQuestion(Pageable page);
当你调用这个函数时,像这样初始化page
:
securityQuestionRepository.findQuestion(new PageRequest(0, 3));
或者只使用原生查询:
@Query(nativeQuery = true,
value = "select * from user_security_question order by question_id asc limit 0, 3")
public List<SecurityQuestion> findQuestion();
【讨论】:
@Query(nativeQuery = true, value = "select * from user_security_question order by question_id asc limit 0, 3") public Listdefault List<SecurityQuestion> findQuestion() return findQuestion(new PageRequest(0, 3));
,这样调用者就不需要指定Pageable
参数。【参考方案2】:
还有一个更简单的变体:
public interface SecurityQuestionRepository extends JpaRepository<SecurityQuestion, Integer>
List<SecurityQuestion> findTop3ByOrderByIdAsc();
更多信息是here。
【讨论】:
这应该是最佳答案。无需设置可分页结果。简单【参考方案3】:在@Query
注解内添加参数nativeQuery = true, value = "your query"
。
【讨论】:
以上是关于Spring Data JPA自定义查询限制功能不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Spring Data Jpa 使用@Query标注自定义查询语句
Spring Data 系列学习Spring Data JPA 自定义查询,分页,排序,条件查询
Spring Data 系列学习Spring Data JPA 自定义查询,分页,排序,条件查询