3 回答

TA贡献1827条经验 获得超9个赞
您必须设置不同的,并检查查询返回类型:
将调用长分页计数查询
Specification<com.bitweb.syda.data.entity.service.Service> spec = (root, cq, cb) -> {
if(!Long.class.isAssignableFrom(cq.getResultType())) {
cq.distinct(true);
}
//else {
//create a query for count case if needed
//}
return null;
};
编辑的答案:
在这种情况下,考虑到 updateTime 可能指示作业排序,我建议您执行以下操作:
Specification<com.bitweb.syda.data.entity.service.Service> spec = (root, cq, cb) -> {
if(!Long.class.isAssignableFrom(cq.getResultType())) {
if(sort.contains("jobs")) {
Join<Service, Job> jobs = root.join("jobs");
//check for asc or desc
cq.orderBy(cb.asc(jobs.get("updateTime")));
}
cq.distinct(true);
}
//else {
//create a query for count case if needed
//}
return null;
};
干杯

TA贡献1842条经验 获得超12个赞
您需要有一个唯一的订单标准。如果不确定,请添加“id”作为最低优先级的排序条件。
问题是:如果未指定到记录级别,则数据库排序未定义。即:如果您指定排序但保留最后一位未定义(即,如果两行满足相同的排序条件),您将遇到即使一行中的两个相同查询也会返回相同的结果,但顺序不同。

TA贡献1900条经验 获得超5个赞
你可以做这样的事情
public Page<com.bitweb.syda.data.entity.service.Service> getServicesList(ServiceListRequest request, Pageable pageable) {
Specification<com.bitweb.syda.data.entity.service.Service> spec = (root, query, builder) -> {
//you can do any check here if you want with the join and check all the search parameters here if you want
//Join<Object, Object> jobs = root.join("jobs");
// also set query to get distinc values
query.distinct(true);
return null;
};
if (request.getSearch() != null) spec = spec.and(search(request.getSearch()));
if (request.getName() != null) spec = spec.and(name(request.getName()));
if (request.getJobs() != null) spec = spec.and(hasJobs(request.getJobs()));
if (request.getNeedsPatrol() != null) spec = spec.and(needsPatrol(request.getNeedsPatrol()));
return serviceRepository.findAll(spec, pageable);
}
添加回答
举报