Как преобразовать SQL с соединением и подзапросом в запрос CriteriaBuilder? - PullRequest
0 голосов
/ 11 апреля 2019

У меня следующий запрос SQL

SELECT cb.id cbId, cb.name cbName, d.id drugId, d.name drugName, array_agg(sel.id) dependencyDrugIds
FROM businesses cb
  LEFT JOIN scenarios s ON cb.id = s.cb_id
  LEFT JOIN drugs d ON s.id = d.scenario_id
  LEFT JOIN (SELECT d2.id, s2.dependency_id
                     FROM scenarios s2
                       LEFT JOIN drugs d2 ON s2.id = d2.scenario_id
                     WHERE s2.dependency_id is not null
                     ORDER BY d2.id) sel on s.dependency_id = sel.dependency_id
GROUP BY cb.id ,cb.name , d.id, d.name

Я попытался изменить его как запрос, основанный на CriteriaBuilder Но я не знаю, как создать подзапрос. и как присоединить его к полю зависимости_100 *

это вообще возможно? это все, что я получил

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<DrugCbDependenciesDto> criteriaQuery = cb.createQuery(DrugCbDependenciesDto.class);
Root<Business> cbRoot = criteriaQuery.from(Business.class);
Join<Business, Scenario> scenarioJoin = cbRoot.join(Business_.scenarios, LEFT);
Join<Scenario, Drug> drugJoin = scenarioJoin.join(Scenario_.drugs, LEFT);

Subquery<List> subquery = criteriaQuery.subquery(List.class);
Root<Scenario> subRoot = subquery.from(Scenario.class);
Join<Scenario, Drug> subScenarioJoin = subRoot.join(Scenario_.drugs, INNER);
Join<Scenario, Dependency> subDependencyJoin = subRoot.join(Scenario_.dependency, INNER);
subquery.select(subRoot.get(Dependency_.id.getName()));
...