2010-12-07 4 views
3
次のクエリので、

OK:次のようにHibernate Criteria - 結合結果を単一のエンティティタイプに制限する方法?

SELECT O.*, P.* FROM ORDERS O, PRODUCT P WHERE 
    O.ORDER_ID=P.ORDER_ID AND P.ID=’1234’; 

が基準で行うことができる。

List ordersAndProducts = session.createCriteria(Order.class) 
    .setFetchMode(“products”,FetchMode.JOIN) 
    .add(Restrictions.eq(“id”,”1234”)) 
    .list(); 

が、ここCriteria.list()Object[0]OrderObject[1]各要素のProductあるList<Object[]>を返しますリスト内の

しかし、どのように、私は基準では、次のSQL実行できます。つまり

SELECT O.* FROM ORDERS O, PRODUCT P WHERE 
    O.ORDER_ID=P.ORDER_ID AND P.ID=’1234’; 

を、私はCriteria.list()が私にList<Order>を与えたいと思う、私はProducts気にしないでください。私はsetFetchMode()の代わりにcreateAlias()を使用しようとしましたが、結果は同じであり、投影はエンティティを指定することはできません。

答えて

6

.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)を基準に使用できます。

List ordersAndProducts = session.createCriteria(Order.class) 
    .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) 
    .setFetchMode(“products”,FetchMode.JOIN) 
    .add(Restrictions.eq(“id”,”1234”)) 
    .list(); 

ここで、熱心に読み込まれた商品をすべて注文します。

+0

ありがとうございます!私はResultTransformerを使うのは方法だろうと思っていましたが、むしろ不透明なドキュメントは、どちらを使うべきかを知る上であまり役に立ちませんでした。 – mluisbrown

+0

nice回答(geht doch ... :-)) –

+0

setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)についての詳しい説明はどこにありますか? – jhegedus

2

CriteriaクラスのcreateCriteriaメソッドをリレーションシップに使用します。

List ordersAndProducts = session.createCriteria(Order.class) 
    .createCriteria(“products”) 
     .add(Restrictions.eq(“id”,”1234”)) 
    .list(); 

あなたはそれhere程度(やや紛らわしい)ドキュメントを読むことができます。

+0

いいえ、私はすでにそれを試みましたが、それは違いはありませんが、依然としてOrdersとProductsの両方でオブジェクト配列のListを取得します。 – mluisbrown

+0

これは、実際に製品を気にしない(後で製品を呼び出さない)方がよいでしょう。あなたのマッピングや注釈を調べてください。フェッチを介して製品アソシエーションを熱心にロードするように休止状態を指示しましたか?それが理由かもしれません。私は確信をもっていませんが、基準APIがこの指示に従うという信念です。 –

+0

商品のOrderクラスにあるアノテーションは@ManyToOne(fetch = FetchType.LAZY)です。私のために働く唯一の解決策は、上記のResultTransformerを使用することです。 – mluisbrown

関連する問題