【问题标题】:Spring Boot CrudRepository or JpaRepository - how to pass limit as argument?Spring Boot CrudRepository 或 JpaRepository - 如何将限制作为参数传递?
【发布时间】:2018-07-30 15:19:19
【问题描述】:

我有扩展CrudRepository的存储库接口:

public interface ExampleRepository extends CrudRepository<Example, Long>{
    List<Example> findByValidIsTrueLimit(Integer limit);
}

我想将结果列表限制为指定的限制,例如 SQL 查询中的 limit

但是我得到:

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

如何将限制作为参数传递给CrudRepository 方法?

【问题讨论】:

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


    【解决方案1】:

    来自 spring 文档 (Limiting query results):

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

    因此,对于固定限制N,您可以使用List&lt;Example&gt; findTopNByValidIsTrue()

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

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

    【讨论】:

    • getContent() 不是必须的,可以直接获取List
    【解决方案2】:

    您可以使用Pageable,它会给您一个Page&lt;T&gt;,然后您可以从中获取请求的数据。

     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();
    

    注意:如果你在调用findByValidIsTrueLimit时没有传递PageRequest对象,默认情况下会给你前20条记录。

    【讨论】:

    • getContent() 不是必须的,可以直接获取List
    【解决方案3】:

    您可以在方法签名中添加Pageable。例如

    List&lt;Example&gt; findByValidIsTrue(Pageable p);

    用法:

    List&lt;Example&gt; ex = repo.findByValidIsTrue(new PageRequest(0, 10));

    【讨论】:

      猜你喜欢
      • 2020-02-09
      • 2019-09-27
      • 2022-11-30
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多