Как конвертировать SQL-запрос с подзапросом и рассчитывать на построитель критериев JPA

Я пытаюсь преобразовать этот SQL-запрос, чтобы использовать построитель критериев JPA. Ответ должен быть двойным или плавающим.

SELECT CAST((COUNT(m.id) -
(SELECT COUNT(s.id) 
 FROM mobile_unit as s
 left JOIN incident as i ON s.incidentId=i.id
 JOIN organizational_unit as o ON s.organizationalUnitId=o.id
 WHERE (s.organizationalUnitId = 1 AND s.incidentId IS NULL))) AS float) 
/COUNT(m.id) 
FROM mobile_unit as m 
JOIN organizational_unit as o ON m.organizationalUnitId=o.id
WHERE m.organizationalUnitId = 1
1 ответ

Без проверки этого, вот примерный пример того, как это можно сделать.

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<float> cq = cb.createQuery(Float.class);
Root<**********> root = cq.from(MobileUnit.class);
// Join is actually unnecessary
root.join("organizationalUnit", JoinType.INNER);
cq.where(cb.equal(
 root.get("organizationalUnitId"),
 1
));
Subquery<long> subquery = cq.subquery(Long.class);
Root<**********> subRoot = subquery.from(MobileUnit.class);
// Actually these joins are unnecessary, but you requested them..
subRoot.join("incident", JoinType.LEFT);
subRoot.join("organizationalUnit", JoinType.INNER);
subquery.select(cb.count(subRoot.get("id")));
subquery.where(cb.and(
 subRoot.get("organizationalUnitId").eq(cb.literal(1)),
 subRoot.get("incidentId").isNull()
));
cq.select(cb.quot(
 cb.diff(
 cb.count(root.get("id")),
 subquery
 ).as(Float.class),
 cb.count(root.get("id"))
));
</**********></long></**********></float>

licensed under cc by-sa 3.0 with attribution.