2011-07-19 14 views
12

は、2つの関係次の点を考慮Hibernate:多対多の結合テーブルを持つ基準?

@Entity class Foo { 
    @Id id; 

    @ManyToMany 
    @JoinTable(name = "ATag", 
     joinColumns = @JoinColumn(name = "foo_id"), 
     inverseJoinColumns = @JoinColumn(name = "tag_id")) 
    Set<Tag> tags; 
} 

@Entity class Tag { 
    @Id Long id; 
    String name; 
} 

はテーブルATAGに参加するには、対応するエンティティクラスはありません。今、私はすべてのFooのインスタンスをTag1という名前のTagで取得したいのですが、それはCriteriaだけを使うことですか?

サブクエリが役に立つかもしれませんが、存在しないATag.classクラスのDetachedCriteriaを作成することはできません。

答えて

24

この正確な問題をちょうど処理しました。あなたはテーブルではなく、オブジェクトで考えています。ただ、tags.nameを参照すると、Hibernateは残りの世話をしてみましょう:

Criteria crit = session.createCriteria(Foo.class); 
crit.createAlias("tags", "tagsAlias"); 
crit.add(Restrictions.eq("tagsAlias.name", someValue); 

あなたはSQL Hibernateが吐き出す見た場合、あなたはそれが結合テーブルを使用して表示されます。

+1

オブジェクト自体のプロパティではなくオブジェクトのプロパティの使用について注意することが重要です。制限を使用するHibernateは、POJOで定義されたプライマリキーを使用するだけではありません。ここでは、オブジェクトタグの属性名を使用しています。私は、明示的ではなくオブジェクト全体を設定しようとすると時間を失い、条件述語の下でどのプロパティをチェックする必要があるかを述べました。 –

+3

エイリアスを使用する必要があるのはなぜですか? 'tagsAlias.name'の代わりに単に' tags.name'を使用することはできませんか? – sp00m

+0

エイリアスを作成すると、自動的に内部結合が行われます。 – derrik

関連する問題