是否可以获取用户定义范围内的数据[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.
});
如果你有更好的选择,你也可以建议我。
感谢。
答案 0 :(得分:8)
你的方法不起作用,因为new PageRequest(0, 10);
没有做你想的。如docs中所述,输入参数为page
和size
,不是限制和偏移。
据我所知(如果我错了,有人会纠正我),没有开箱即用的#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);
客户只需跟踪偏移量而不是页码即可。我的意思是,您的控制器将收到偏移量而不是页码。
希望这会有所帮助!