2012-09-26 64 views
2

讓我們假設我有3個抽象超類:SuperASuperBSuperC。 讓我們假設每個超類都有很多更具體的實現,並且所有的超類都注有@Inheritance(strategy = InheritanceType.JOINED)JPQL和繼承

更具體的:

  • Aa < - SuperA並具有SuperB(的bbs屬性)的列表;
  • Bb < - SuperB並且具有列表SuperCccs屬性);
  • Cc < - SuperC並具有foo屬性。

然後,當我嘗試類似下面的查詢,我得到了一個錯誤,指出它無法在類型SuperC找物業fooBb有一個抽象類型的列表,我不能改變它。所以,我不知道如何使查詢有效。

select a from Aa a left outer join a.bbs b where b.ccs.foo = :foo 

任何提示都會有所幫助。提前致謝。


編輯:

BTW:異常:

org.hibernate.exception.SQLGrammarException: Unknown column 'cc3_1_.foo' in 'where clause'


編輯2:

我找JPA文檔,發現something可以工作,如果我不使用Hibernate。


編輯3:

我改變它使用兩個SQL的。首先,我找到了基於foo屬性的C的id,然後我只是用查詢比較id。

這裏的問題是,我必須每次都要做2個SQL ......但是,至少它是有效的。

+0

它的氣味就像你的ORM框架的一個bug,只是因爲你想訪問'Cc'表中的屬性/字段而不是'SuperC'。 Programaticaly你應該使和明確投到SuperC.foo .... –

+0

一個問題,這是一個生成的查詢或手動建立? –

+0

基於這篇文章[鏈接] http://www.java。net/node/668740 [/ link],你可以在你的映射中使用後代類代替你的超級類...'class Aa {private List ccs; ....' –

回答

2

你需要一個更加入了抄送的名單則應該是罰款:

select a from Aa a left outer join a.bbs b join b.ccs c where c.foo = :foo 

爲CCS是無法「取消引用」這是物業這樣的列表,如果你你能止跌」您可以簡單地寫:a.bbs.ccs.foo但這不是的情況,所以您需要按照上面的說明加入列表。

+0

謝謝。有用 – caarlos0