У меня есть следующий тип запроса, который я хочу преобразовать в запрос критериев jpa и следующую структуру таблицы:
Table A 1-->1 Table B 1<--* Table C (proceedings) *-->1 Table D(prcoeedingsstatus)
-------- -------- ------- -------
aID bID cID dID
... .... timestamp textValue
f_bID .... f_bID
f_dID
1 A имеет 1 B, 1 B имеет много производств, и каждое разбирательство имеет статус производства.
SELECT a.*
FROM ((a LEFT JOIN b ON a.f_b = b.id)
LEFT JOIN proceedings ON b.id = proceedings.f_b)
RIGHT JOIN proceedingsstatus ON proceedings.f_d = proceedingsstatus.id
WHERE d.textValue IN ("some unique text")
AND c.timestamp BETWEEN 'somedate' AND 'anotherdate'
Когда я сейчас пытаюсь сделать что-то подобное для предикатов:
Predicate conditions = (root.join("tableB")
.joinList("proceedings")
.join("proceedingsstatus").get("textValue"))
.in(constraintList.getSelectedValues());
Predicate time = cb.between((root.join("tableB")
.joinList("proceedings")
.<Date>get("timestamp")), dt1.toDate(), dt2.toDate());
constraints = cb.and(conditions, time);
Прямо сейчас он выбирает записи A, в которых есть хотя бы 1 вхождение правильного статуса процесса в соответствии с предикатом условий, если в любом из процессов A «метка времени» соответствует предикату времени, который я построил. Таким образом, он также выбрал бы запись A, когда C.timestamp является правильным для продолжения с неправильным textValue в D, если есть хотя бы одна запись C, принадлежащая A с правильным текстовым значением в D.
Как я могу изменить его так, чтобы он выбирал только те A, где статус производства имеет правильное значение И время поступления является правильным?