Spring Boot CrudRepository或JpaRepository - 如何将limit作为参数传递?

时间:2018-02-20 09:50:58

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

我有扩展CrudRepository

的存储库接口
public interface ExampleRepository extends CrudRepository<Example, Long>{
    List<Example> findByValidIsTrueLimit(Integer limit);
}

我希望将结果列表限制为指定限制,例如在SQL查询中使用limit

但是我得到了:

  

引起:org.springframework.beans.factory.BeanCreationException:   创建名称为&#39; exampleRepository&#39;:init的调用时出错   方法失败;嵌套异常是java.lang.IllegalArgumentException:   无法创建查询方法public abstract未找到属性限制   对于类型

如何将作为参数传递的限制添加到CrudRepository方法?

3 个答案:

答案 0 :(得分:1)

您可以在方法签名中添加Pageable。 E.g。

List<Example> findByValidIsTrue(Pageable p);

用法:

List<Example> ex = repo.findByValidIsTrue(new PageRequest(0, 10));

答案 1 :(得分:1)

从春季文档(Limiting query results):

  

查询方法的结果可以通过关键字first或top来限制,可以互换使用。可选的数值可以附加到top / first以指定要返回的最大结果大小。如果省略该数字,则假定结果大小为1。

因此,对于固定限额N,您可以使用List<Example> findTopNByValidIsTrue()

对于变量的限制值,您应该使用Pageable

Page<Example> findByValidIsTrue(Pageable pageable);
List<Example> result = repository.findByValidIsTrue(new PageRequest(0, N)).getContent();

答案 2 :(得分:1)

您可以使用Pageable,它会为您提供Page<T>,然后您就可以从中获取所请求的数据。

 Page<Example> findByValidIsTrue(Pageable pageable);

然后使用PageRequest调用它: -

    PageRequest req = new PageRequest(0,10); // I just want 10 record
    Page<Example> page =  findByValidIsTrue(req )
    List<Example> nRecords = page.getContent();

注意:如果您在调用PageRequest时未通过findByValidIsTrueLimit对象,则默认情况下,它会为您提供前20条记录。