2011-11-15 59 views
0

我有以下HQL查詢,它工作正常,但它返回完整FooD對象的列表。我只需要FooD對象的ID,因爲我需要更快的查詢。請不要在Hibernate映射中,FooD與FooB有多對一的關係。休眠左連接抓取 - 只獲取第一個表的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" 

我指定連接抓取「查詢,但所獲取的關聯的所有者不存在在選擇列表中「。

我已經然後轉換查詢,以常規的Oracle SQL只拿到FooD.ID:

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,並有d.ts爲where子句,爲什麼你需要在同一個查詢中初始化d.bill? –

+0

因爲我只需要d.id有賬單(d.bill是FooB.id)。 – cvsoftware

回答

0

更新:

我沒有測試,但是這應該做的伎倆

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

當你添加離開你讓一個外部聯接含蓄,並沒有需要初始化法案如果你需要的是按鍵的加入


Hibernate對對象是選擇條款做任何渴望加入取就可以了

但是由於您在d.bill上沒有選擇或where子句,您爲什麼還需要取回它?

如果你需要的是id,爲什麼不這樣做,沒有理由冗餘連接:

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

看到這個問題以及:http://www.coderanch.com/t/217246/ORM/java/Hibernate-Eager-fetching –

+0

因爲我需要得到所有FooD誰擁有賬單(d.bill是外鍵鏈接到FooB.id)。 – cvsoftware

+0

感謝您的鏈接!不過,我不明白我怎麼能做到我的左邊加入它。 – cvsoftware