1

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 のみを選択するように変更するにはどうすればよいですか?

4

1 に答える 1

1

述部ごとに新しい結合を作成する代わりに、結合を再利用します。

Join proceedings = root.join("tableB").joinList("proceedings");
于 2012-11-07T21:04:34.957 に答える