7
    @Entity
    public class Person {

        @ElementCollection
        private List<Location> locations;

        [...]

    }

    @Embeddable
    public class Location {

        private Integer dummy;

        private Date creationDate;

        [...]

    }

次の構造が与えられた場合、次の SQL に相当する HQL または CriteriaQuery を実行したいと思います。

SELECT
    l.*
FROM
    Location l
INNER JOIN
    Person p ON (p.id = l.person_id)
WHERE
    p.id = ? AND l.creationDate > ?

指定された人物に関連付けられていて、その作成日が指定された日付よりも後の場所のリストを取得したいと考えています。

前もって感謝します!

マーク

編集***: ちょっと誤解を招くので、SQL を編集しました。場所を個別に照会したくありません。

4

2 に答える 2

17

これは不可能です。クエリを実行することはできませんEmbeddable。JPAウィキブックスから:

埋め込みコレクション

マッピングを使用して、オブジェクトのElementCollectionコレクションを定義でき Embeddableます。Embeddableオブジェクトはソースオブジェクトのテーブルに埋め込まれていませんが、別のコレクションテーブルに格納されているため、これはオブジェクトの一般的な使用法ではありません。OneToManyこれは、ターゲットオブジェクトがのEmbeddable 代わりにあることを除いて、に似ていEntityます。Idこれにより、単純なオブジェクトでマッピングまたは ManyToOne逆マッピング を定義しなくても、単純なオブジェクトのコレクションを簡単に定義できます。ElementCollectionマッピングまたはコレクションのテーブルをオーバーライドすることもできるため、複数のエンティティに同じEmbeddableクラスを参照させることができますが、それぞれに依存オブジェクトを別々のテーブルに格納させることができます。

ElementCollectionの代わりに 使用する場合の制限は OneToMany、ターゲットオブジェクトを親オブジェクトとは独立してクエリ、永続化、マージできないことです。Embeddedそれらは、マッピングと同じように、厳密に個人所有の(依存する)オブジェクトです。にはカスケードオプションはありません ElementCollection。ターゲットオブジェクトは常に親と一緒に永続化、マージ、削除されます。 ElementCollection他のコレクションマッピングと同じように、フェッチタイプを使用でき、デフォルトはLAZYになります。

目的を達成するには、との代わりにとを使用OneToManyEntityます。または、アプローチを変更してクエリを実行します。ElementCollectionEmbeddablePerson

于 2010-09-14T12:50:37.067 に答える
2

パスカルの返事のキーフレーズは

ターゲット オブジェクトは、親オブジェクトから独立してクエリ、永続化、マージすることはできません

親オブジェクトに依存しているため、次のようなものを使用してこれを行うことができるはずです...

SELECT p FROM PERSON, IN (p.locations) WHERE p.id = ?1 AND locations = ?2

( JP-QL (JPA 2.0) の 'ElementCollection' Map フィールドに対する Execute "MEMBER OF" query での返信に基づく- これは実際には私が答えを探していた Map @ElementCollection です!)

于 2012-09-02T11:54:24.593 に答える