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條經驗 獲得超13個贊
您需要有一個唯一的訂單標準。如果不確定,請添加“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);
}
添加回答
舉報