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 を選択します。したがって、D に正しいテキスト値を持つ A に属するエントリ C が少なくとも 1 つある場合、C.timestamp が D に間違った textValue を持つ処理に対して正しい場合にも、エントリ A が選択されます。
手続きステータスが正しい値を持ち、手続きの時間が正しい A のみを選択するように変更するにはどうすればよいですか?