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

时间:2015-09-11 14:06:07

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

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

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

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

spec是我定义的规范,但不幸的是,这没有帮助。 可能是我在这里做错了。

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

用户可以输入类似localhost:8080 / Section / employee的内容吗?范围{&#34; COLUMNNAME&#34;:名称,&#34;从&#34;:6,&#34;至&#34; 20}

因此,这表示获取员工数据并且它将获取前15条记录(按columnName排序)并不重要。

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

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

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

});

如果你有更好的选择,你也可以建议我。

感谢。

4 个答案:

答案 0 :(得分:8)

你的方法不起作用,因为new PageRequest(0, 10);没有做你想的。如docs中所述,输入参数为pagesize,不是限制和偏移。

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

答案 1 :(得分:4)

我们可以通过分页和设置数据库表列名称,值和&amp;来完成此操作。行计数如下:

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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

希望这会有所帮助!