如何使用用户定义的偏移量和限制(范围)通过 Spring 数据 JPA 查询数据

How to query data via Spring data JPA with user defined offset and limit (Range)

是否可以在用户定义的范围内获取数据[int starting 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":名称,"from":6,"to":20}

这就是说要获取员工数据,它会获取前 15 条记录(按 columnName 排序),目前这并不重要。

如果你能给我一些更好的建议great.if你认为我提供的信息不够,请告诉我,我会提供所需的信息。

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

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

});

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

谢谢。

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

 @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;
}

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

据我所知(如果我错了,请有人纠正我),在默认的 SrpingData 存储库中没有 "out of the box" 支持您需要的内容。但是您可以创建 Pagable 的自定义实现,它将采用 limit/offset 参数。这是基本示例 -

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

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

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

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

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

所以我得到了这个作为建议的答案之一,我实现了我自己的 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");
    }

其中 startIndex ,endIndex 是记录的开始索引和最后索引。

访问它:

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

没有您可以简单传递的偏移参数。然而,有一个非常简单的解决方案:

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

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

希望对您有所帮助!