【问题标题】:Spring Data JPA Custom Query limit functionality not working [duplicate]Spring Data JPA自定义查询限制功能不起作用[重复]
【发布时间】: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&lt;SecurityQuestion&gt; 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...:)

标签: spring hibernate spring-boot spring-data spring-data-jpa


【解决方案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 List findQuestion();这工作正常
  • 这是迄今为止我在这个主题上看到的最好的答案。本机查询始终是最不受欢迎的选项,因为它违背了 JPA 的目的。考虑到数据库之间的“限制”功能差异很大(例如 postgres 与 oracle)
  • 假设您使用的是Java 8,您可以添加default List&lt;SecurityQuestion&gt; 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2012-09-13
    • 2019-03-10
    • 1970-01-01
    相关资源
    最近更新 更多