【问题标题】:How to query data via Spring data JPA with user defined offset and limit (Range)如何使用用户定义的偏移量和限制(范围)通过 Spring 数据 JPA 查询数据
【发布时间】:2015-12-08 03:08:57
【问题描述】:

是否可以在用户定义的范围内获取数据[int start record -int last record]?

在我的例子中,用户将在查询字符串中定义,他想要在其中获取数据的范围。 我已经尝试过这样的事情

Pageable pageable = new PageRequest(0, 10);
    Page<Project> list = projectRepository.findAll(spec, pageable);

spec 是我定义的规范,但不幸的是,这无济于事。 可能是我在这里做错了什么。

我见过其他 spring jpa 提供的方法,但没有什么帮助。

用户可以输入类似 localhost:8080/Section/employee 的内容吗?范围{"columnName":name,"from":6,"to":20}

所以这表示要获取员工数据,它会获取前 15 条记录(按 columnName 排序),到目前为止并不重要。

如果您能向我推荐更好的东西,那就太好了。如果您认为我没有提供足够的信息,请告诉我,我会提供所需的信息。

更新:我不想使用本机或创建查询语句(直到我没有任何其他选择)。 可能是这样的:

Pageable pageable = new PageRequest(0, 10);
        Page<Project> list = projectRepository.findAll(spec, new pageable(int startIndex,int endIndex){
// here my logic.

});

如果你有更好的选择,也可以向我推荐。

谢谢。

【问题讨论】:

    标签: spring spring-mvc spring-data-jpa spring-data


    【解决方案1】:

    您的方法无效,因为new PageRequest(0, 10); 没有按照您的想法行事。如docs 中所述,输入参数为pagesize,而不是limit 和offset。

    据我所知(如果我错了,有人会纠正我),默认 SrpingData 存储库中没有“开箱即用”的支持。但是您可以创建Pagable 的自定义实现,它将采用限制/偏移参数。这是基本示例 - Spring data Pageable and LIMIT/OFFSET

    【讨论】:

    • 感谢您的回答,它肯定给了我方向。
    【解决方案2】:

    我们可以通过分页来做到这一点,并通过如下设置数据库表的列名、值和行数:

     @Transactional(readOnly=true)
     public List<String> queryEmployeeDetails(String columnName,String columnData, int startRecord, int endRecord) {
        Query query =  sessionFactory.getCurrentSession().createQuery(" from Employee emp where emp.col= :"+columnName);
        query.setParameter(columnName, columnData);
        query.setFirstResult(startRecord);
        query.setMaxResults(endRecord);
        List<String> list = (List<String>)query.list();
        return list;
    }
    

    【讨论】:

    • 感谢您的回答...您能说明一下吗,我们如何通过分页实现这一目标?
    • 我相信你是想写from Employee emp where emp.' + columnName + '= :foo'然后query.setParameter("foo", columnData);
    【解决方案3】:

    如果我正确理解您的问题,您希望您的存储库允许用户

    1. 提供查询条件(通过Specification
    2. 提供要排序的列
    3. 提供要检索的结果范围。

    如果我的理解是正确的,那么:

    为了实现1.,您可以使用Spring Data JPA中的JpaSpecificationExecutor,它允许您传入Specificiation进行查询。

    通过使用PagableJpaSpecificationExecutor 可以实现 2 和 3。 Pageable 允许您为查询提供起始索引、记录数和排序列。您将需要实现基于范围的PageablePageRequest 是一个很好的参考,你可以实现什么(或者我相信你可以扩展它)。

    【讨论】:

    • 感谢您的回答,您能否将我重定向到一些示例,其中显示了 JpaSpecificationExecutor 的使用?不幸的是我没有找到。
    • 实际上没用过。以下是我通过 google 找到的内容:spring.io/blog/2011/04/26/… 虽然他们使用 QueryDSL 进行规范构建,但我相信您可以通过一些更加手工制作的方式来完成(QueryDSL 需要代码生成,这可能是您关心的问题)。至少该页面让您了解如何使用JpaSpecificationExecutor
    • 其实我错过了Pageable 也提供Sort。因此,自定义 Pageable(或使用 PageRequest)就可以解决问题
    【解决方案4】:

    所以我得到这个作为建议的答案之一,我实现了自己的 Pageable 并覆盖了 getPagesize(),getOffset(),getSort() 就是这样。(在我的情况下,我不需要更多)

    public Range(int startIndex, int endIndex, String sortBy) {
            this.startIndex = startIndex;
            this.endIndex = endIndex;
            this.sortBy = sortBy;
        }
    
        @Override
        public int getPageSize() {
            if (endIndex == 0)
                return 0;
            return endIndex - startIndex;
        }
    
        @Override
        public int getOffset() {
            // TODO Auto-generated method stub
            return startIndex;
        }
    
        @Override
        public Sort getSort() {
            // TODO Auto-generated method stub
            if (sortBy != null && !sortBy.equalsIgnoreCase(""))
                return new Sort(Direction.ASC, sortBy);
            else
                return new Sort(Direction.ASC, "id");
        }
    

    其中 startIndexendIndex 是记录的起始索引和最后索引。

    访问它:

    repository.findAll(spec,new Range(0,20,"id");

    【讨论】:

      【解决方案5】:

      没有可以简单地传递的偏移参数。但是有一个非常简单的解决方案:

      int pageNumber = Math.floor(offset / limit) + ( offset % limit );
      PageRequest pReq = PageRequest.of(pageNumber, limit);
      

      客户端只需要跟踪偏移量而不是页码。我的意思是您的控制器将收到偏移量而不是页码。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-27
        • 1970-01-01
        • 2019-09-22
        • 2014-02-21
        • 1970-01-01
        • 2012-05-18
        相关资源
        最近更新 更多