【问题标题】:Spring Data: limit result for custom querySpring Data:自定义查询的限制结果
【发布时间】:2017-10-15 17:05:23
【问题描述】:

在我的 Spring Data 存储库中,我(必须)使用 @Query 注释使用自定义查询。我知道我可以限制这样的命名查询中的结果数

Iterable<Person> findFirst5OrderByLastName()

或者可以通过传递这样的可分页来限制结果的数量

Iterable<Person> findByLastName(String lastName, Pageable pageable)

但是使用自定义@Query注解是否可以达到同样的效果?

TIA

编辑

我看到我的问题有点令人困惑,请澄清一下: 我想要的是在使用自定义查询时限制我得到的结果的数量,这样我既不

1) 需要通过pageable来指定result-size

2) 需要使用命名查询来指定result-size

事实上,我希望在调用方法时对结果数量的限制是完全透明的(因此不传递Pageable)并且不依赖于 Spring Data 的命名方案(作为方法最好通过自定义名称来传达)

【问题讨论】:

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


【解决方案1】:

你需要扩展 PagingAndSortingRepository

并添加方法

Page<Person> listAllByPage(Pageable pageable)

the example

【讨论】:

    【解决方案2】:

    你可以试试这个:

    @Entity
    @Table(name = "persons") 
    public class Person {
        //...
    }
    
    @Query(value = "select * from persons limit 50", nativeQuery = true)
    List<Person> getFirst50();
    

    不要忘记检查您的 SQL 服务器是否支持 limit 关键字。

    【讨论】:

      【解决方案3】:

      当然你可以使用@Query 来排序结果,例如 JPQL 查询

      @Query("SELECT u FROM User u ORDER BY u.name ASC")
      

      可以通过提供 PageRequest 或直接使用 Sort 来进行进一步的排序。

      https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.sorting

      【讨论】:

      • 问题与如何限制查询结果大小有关,与排序无关
      【解决方案4】:

      我建议添加“By”但没有参数,它会起作用:

      List<Person> findTop100By();
      

      【讨论】:

        【解决方案5】:

        你好,你可以试试这个

        @Query("...")
        List<YourDTO>getData(Pageable pageable)
        

        在你的 serviceImpl 中

            List<YourDTO> getData(){
            int limit=10;
            Pageable pageable = PageRequest.of(0, limit);
            return this.repo.getData(pageable);
        }
        

        你应该避免使用 nativeQuery

        【讨论】:

          猜你喜欢
          • 2020-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-25
          • 2015-12-07
          • 1970-01-01
          • 2017-10-24
          • 2015-08-09
          相关资源
          最近更新 更多