如何使用用户定义的偏移量和限制(范围)通过 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所述,输入参数是page
和size
,而不是limit和offset。
据我所知(如果我错了,请有人纠正我),在默认的 SrpingData 存储库中没有 "out of the box" 支持您需要的内容。但是您可以创建 Pagable
的自定义实现,它将采用 limit/offset 参数。这是基本示例 -
如果我对你的问题的理解正确,你希望你的存储库允许用户
- 提供查询条件(通过
Specification
)
- 提供要排序的列
- 提供要检索的结果范围。
如果我的理解是正确的,那么:
为了实现 1.,您可以使用 Spring Data JPA 中的 JpaSpecificationExecutor
,它允许您传入 Specificiation
进行查询。
2 和 3 都可以在 JpaSpecificationExecutor
中通过使用 Pagable
实现。 Pageable
允许您为查询提供起始索引、记录数和排序列。您将需要实施基于范围的 Pageable
。 PageRequest
是关于您可以实现什么的很好的参考(或者我相信您可以扩展它)。
所以我得到了这个作为建议的答案之一,我实现了我自己的 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);
客户端只需跟踪偏移量而不是页码。我的意思是您的控制器将收到偏移量而不是页码。
希望对您有所帮助!
是否可以在用户定义的范围内获取数据[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所述,输入参数是page
和size
,而不是limit和offset。
据我所知(如果我错了,请有人纠正我),在默认的 SrpingData 存储库中没有 "out of the box" 支持您需要的内容。但是您可以创建 Pagable
的自定义实现,它将采用 limit/offset 参数。这是基本示例 -
如果我对你的问题的理解正确,你希望你的存储库允许用户
- 提供查询条件(通过
Specification
) - 提供要排序的列
- 提供要检索的结果范围。
如果我的理解是正确的,那么:
为了实现 1.,您可以使用 Spring Data JPA 中的 JpaSpecificationExecutor
,它允许您传入 Specificiation
进行查询。
2 和 3 都可以在 JpaSpecificationExecutor
中通过使用 Pagable
实现。 Pageable
允许您为查询提供起始索引、记录数和排序列。您将需要实施基于范围的 Pageable
。 PageRequest
是关于您可以实现什么的很好的参考(或者我相信您可以扩展它)。
所以我得到了这个作为建议的答案之一,我实现了我自己的 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);
客户端只需跟踪偏移量而不是页码。我的意思是您的控制器将收到偏移量而不是页码。
希望对您有所帮助!