web-dev-qa-db-ja.com

Hibernate基準:マップされた関連付けのないテーブルの結合

HibernateのクライテリアAPIを使用して、2つのエンティティを結合する特定のクエリを作成したいと思います。所有者が多くのペットを持つペットと所有者の2つのエンティティがありますが、決定的に重要なのは、その関連付けがJavaアノテーションまたはxmlにマッピングされないことです。

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

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

ありがとう、J

69
Snukker

私の理解では、HQLを使用してこれを行うと、内部結合ではなく、フィルターを使用してデカルト結合を作成します。基準クエリはこれをサポートしていません。

61
David M

これは確かに基準で可能です:

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つのエンティティで基準を使用できます。

77

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);

所有者の名前を使用して参加すると仮定します。

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