Я пытался преобразовать собственный запрос в запрос построителя критериев. Я преобразовал некоторую часть запроса, но столкнулся с трудностями при преобразовании части запроса с подзапросом, запрос выглядит следующим образом
select OCS.*
from OCS, OCS_LINE
where
OCS.OCS_ID=OCS_LINE.OCS_ID
AND (select sum(LINE_AMOUNT) from OCS_LINE as OCLI where OCLI.OCS_ID = OCS.OCS_ID) >0
AND OCS_LINE.CS_CD in (Select CCS.CS_CD from CONFIG_CS_CODE as CCS where USAGE_TYPE = 'Vouchers'
AND OCS.SALES_DATE >= CCS.VALID_FROM AND OCS.SALES_DATE <= CCS.VALID_TO)
Java-код
public List<OCS> findOCSList(SearchBo SearchBo){
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<OCS> cq = builder.createQuery(OCS.class);
Root<OCS> root = cq.from(OCS.class);
List<Predicate> predicates = buildOCSPredicates(SearchBo, builder, root,cq);
if (!predicates.isEmpty()) {
Predicate[] predicatesArray = predicates.toArray(new Predicate[predicates.size()]);
cq.where(predicatesArray);
}
TypedQuery<OCS> query = em.createQuery(cq);
//query.setMaxResults(Constants.MAX_RESULTS_SIZE_LIMIT);
return query.getResultList();
}
метод
public List<Predicate> buildOCSPredicates(SearchBo searchBo, CriteriaBuilder builder, Root<OCS> OCS ,CriteriaQuery<OCS> cq) {
List<Predicate> predicates = new ArrayList<Predicate>();
Path<Date> salesDate = OCS.get("salesDate");
predicates.add(builder.greaterThanOrEqualTo(salesDate, searchBo.getFromDate()));
....
..
Subquery<ConfigCSCode> cqConfigCSCodeSubQuery = cq.subquery(ConfigCSCode.class);
Root<ConfigCSCode> rootConfigCSCode = cqConfigCSCodeSubQuery.from(ConfigCSCode.class);
Path<String> cSCd = rootConfigCSCode.get("cSCd");
cqConfigCSCodeSubQuery.where(builder.equal(cSCd, "Vouchers"));
predicates.add(builder.in(cashSheetCodeOCS).value(cqConfigCSCodeSubQuery));<-- compilation error at value
predicates.add(parentPredicate);
return predicates;
}
Любые идеи будут полезны благодаря