JPA Crietiria строитель SubQuery с объединениями - PullRequest
0 голосов
/ 18 мая 2018

Я пытался преобразовать собственный запрос в запрос построителя критериев. Я преобразовал некоторую часть запроса, но столкнулся с трудностями при преобразовании части запроса с подзапросом, запрос выглядит следующим образом

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;
}

Любые идеи будут полезны благодаря

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...