2009-04-06 8 views
67

Hibernateのcriteria APIを使用して、2つのエンティティを結合する特定のクエリを定式化します。ペットとオーナーが2人いるペットとオーナーがペットをたくさん持っていますが、その関連はJavaの注釈やxmlにマッピングされていません。Hibernate criteria:マップされた関連付けなしのテーブルへの結合

hqlでは、所有者クラスにペットのセットを追加するのではなく、クエリで結合を指定することで、「fido」というペットを所有する所有者を選択できます。

休止状態を使用して同じことを行うことはできますか?もしそうなら、どのように?

おかげで、あなたはこのHQLを使用して行う場合 J

答えて

56

私の理解では、あなたがデカルトを作成しているされていることは、内部結合ではなく、フィルタで参加します。条件照会はこれをサポートしていません。

+0

ダビデはこの上正しい、あなたはHSQL –

+8

でそれを行うことができます条件でこれを行うことはできません申し訳ありませんが、突然ノーコメントや説明で、ほぼ4歳の答えにdownvoteを得ました。誰でも気をつけてみる? –

+13

私はちょうどそれを補うためにランダムupvoteを与えた –

-1

SQLCriterionがあります。これは任意のSQLとし、Criteriaに追加できます。 SQL文字列では、トークン{alias}は "ルートエンティティのエイリアスに置き換えられます。"

+2

これを行うには?どのような例ですか? – iPhoneJavaDev

+0

例または(少なくとも)リンクは提供されていません。 – n3k0

+0

SQLCriterionは保護されたコンストラクタを持っています – AndreyT

1

NHibernateでは、DetachedCriteriaとして定義されたサブクエリを使用できます。それはJavaで同じ動作するかどうかわからない、おそらくそれは同じです:

DetachedCriteria pets = DetachedCriteria.For<Pet>("pet") 
    .SetProjection(Projections.Property("pet.ownername")) 
    .Add(/* some filters */); 

session.CreateCriteria(typeof(Owner)) 
    .Add(Subqueries.PropertyIn("name", pets); 

を想定、それは所有者の名前を使用して結合していること。

73

はこれが基準に実際に可能である:

DetachedCriteria ownerCriteria = DetachedCriteria.forClass(Owner.class); 
ownerCriteria.setProjection(Property.forName("id")); 
ownerCriteria.add(Restrictions.eq("ownername", "bob")); 

Criteria criteria = getSession().createCriteria(Pet.class); 
criteria.add(Property.forName("ownerId").in(ownerCriteria)); 

更新:これは実際に代わりに参加するのサブクエリを実行しますが、それはあなたが休止状態の関係を持っていない2つのエンティティ上の基準を使用することができます定義された。

+1

なぜ非常に多くの投票がありますか?それはまだ2つの異なる基準の権利ですか? – Reddy

+3

私にとって完璧に働いた、ここでは上の投票が来る – Avanst

+30

問題はこれが結合ではなくサブクエリであるということです。つまり、結果を最初の基準から列で並べ替えることはできません。 –

0
Criterion ownerCriterion = Restrictions.sqlRestriction(SELECT ownerId FROM Owner WHERE ownerName ='bob'); 
Criteria criteria = getSession().createCriteria(Pet.class); 
criteria.createCriteria("ownerId").add(ownerCriterion);