2011-11-15 5 views
0

次のHQLクエリはうまく動作しますが、完全なFooDオブジェクトのリストを返します。より高速なクエリが必要なので、FooDオブジェクトのIDだけが必要です。 Hibernateのマッピングでは、FooDはFooBと多対1の関係を持っていません。Hibernate left join fetch - 最初のテーブルのIDリストだけを取得する

hqlQuery = "from FooD d left join fetch d.bill where d.ts < :ts" 

私は、HQLクエリの同じ種類を使用した唯一のIDを取得しようとしている:

hqlQuery = "SELECT d.id from FooD d left join fetch d.bill where d.ts < :ts" 

私はフェッチに参加し、指定が、フェッチされた協会の所有者が存在していなかった」クエリを得ました選択リストに表示されます。

は、私はその後だけFooD.IDを取得するために、通常のOracle SQLにクエリを変換した:

sqlQuery = "SELECT d.id from FooD d LEFT OUTER JOIN FooB b on d.foodId=b.id where d.ts < :ts" 

私は、このような食品やfoob型のオブジェクトマッピングされています:

sqlQuery.addEntity(FooD.class); 
sqlQuery.addEntity(FooB.class); 

をしてから取得します電話番号:

hSession.createSQLQuery(sql).setTimestamp("ts", ts).list(); 

ただし、次のエラーが表示されます。"unexpected token: on near line 1".

Hibernateを使用してFooBで左外部結合を行うときにFooDのIDだけを取得する方法を知っていますか?

+0

あなただけb.idを必要とし、where句としてd.tsを持っている場合は、なぜあなたは同じクエリでd.billを初期化する必要がありますか? –

+0

私は紙幣を持っているd.idのみ必要です(d.billはFooB.idです)。 – cvsoftware

答えて

0

更新:あなたはLEFTを追加するとき

私はそれをテストしていないが、これはトリック

SELECT d.id from FooD d inner join d.bill where d.ts < :ts 

に行う必要がありますが、あなたはそれの外にする暗黙的に参加し、紙幣を初期化する必要はありませんあなたが必要とするすべては、キー


Hibernateはどんな熱心にそれ

に結合フェッチを行うには、SELECT句にあるようにオブジェクトが必要で参加する場合

しかし、d.billにselectまたはwhere節がないので、どうしてそれを取得する必要がありますか?

あなたが必要とするすべてのIDであれば、なぜこれをしない、冗長な理由はないが参加:

hqlQuery = "SELECT d.id from FooD d where d.ts < :ts" 
+0

この質問も参照してください:http://www.coderanch.com/t/217246/ORM/java/Hibernate-Eager-Fetchching –

+0

私は請求書を持っているすべてのFooDを取得する必要があるので(d.billは外部キーのリンクですFooB.idに)。 – cvsoftware

+0

リンクありがとうございます!しかし、私はそれを使って私の左の結合をどうすることができるのか分かりません。 – cvsoftware