Spring Data JPA自定义查询的限制功能不起作用

5
我已经创建了一个自定义查询。
@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日志:

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

如何使此限制功能在其中起作用?

2
JPQL 不支持 "LIMIT",任何基本的 JPA 文档都会告诉你这一点。 - Neil Stockton
由于一些数据库供应商(主要是Oracle)不支持“limit”关键字,我猜这就是为什么它没有包含在“JPQL”中的原因。使用“Pageable”,可以轻松地转换为“ArrayList”... :) - harshavmb
3个回答

13
尝试使用类型为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<SecurityQuestion> findQuestion(); 这段代码运行良好。 - user5063991
1
这绝对是我在这个话题上看到的最好的答案。本地查询始终是最不受欢迎的选项,因为它违背了JPA的目的。请考虑,例如Postgres和Oracle之间的“limit”功能存在显著差异。 - Jan Zyka
假设您正在使用Java 8,您可以添加 default List<SecurityQuestion> findQuestion() { return findQuestion(new PageRequest(0, 3)); } 以便调用者不需要指定 Pageable 参数。 - Julien Kronegg

6
有一种更简单的变体:
public interface SecurityQuestionRepository extends JpaRepository<SecurityQuestion, Integer>{

    List<SecurityQuestion> findTop3ByOrderByIdAsc();
}

More info is here.


1
这应该是最佳答案。不需要设置可分页的结果。简单明了。 - thonnor

0
在编程方面,将参数nativeQuery = true, value = "your query"添加到@Query注释内。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接