2013-03-05 84 views
0

我有以下類(簡化爲清楚起見):EJBQL - 如何在LEFT現場查詢結果排序連接

Class Top { 
    InternationalStringType name; 
} 

Class InternationalStringType { 
    List<LocalizedStringType> localizedString; 
} 

Class LocalizedStringType { 
    String value; 
} 

以下EJBQL查詢成功地檢索頂部的所有實例與他們的子對象填充:

SELECT DISTINCT Object(t) FROM Top t LEFT OUTER JOIN t.name nm LEFT OUTER JOIN nm.localizedString nm_ls 

我想修改上面的查詢等,結果被Top.name.localizedString.value

什麼是正確的語法做這個排序?我想下面的查詢,但我得到「錯誤:SELECT DISTINCT,ORDER BY表達式必須出現在選擇列表」

SELECT DISTINCT Object(t) FROM Top t LEFT OUTER JOIN t.name nm LEFT OUTER JOIN nm.localizedString nm_ls ORDER BY nm_ls.value ASC 

它不是很清楚,我要放什麼東西在選擇列表中的ORDER BY子句。

下面給出錯誤的「」後對象(T)不管我逗號後放:

SELECT DISTINCT Object(t), Object(nm_ls) FROM Top t LEFT OUTER JOIN t.name nm LEFT OUTER JOIN nm.localizedString nm_ls ORDER BY nm_ls.value ASC 

在情況下,其相關的我的JPA實現休眠3.6.4.Final。 TIA爲您提供幫助。

回答

0

我能夠通過簡單地刪除SELECT子句中的DISTINCT限定詞來使ORDER BY子句適用於我的查詢。我不確定我是否理解這些優點,但以下修改後的查詢完美無缺!

SELECT t FROM Top t LEFT JOIN t.name nm LEFT JOIN nm.localizedString nm_ls ORDER BY nm_ls.value ASC 

我現在得到一個結果集由Top.name.localizedString.value屬性分類爲我所期待的最佳實例。

現在,如果任何人可以解釋爲什麼DISTINCT不起作用,那就太好了。謝謝。

+0

您正在強制將一個連接添加到作爲集合的localizedString中。這意味着對於1個單獨的實體,將會有X個唯一行(每個引用的localizedString一個),所有這些都需要完全構建該實體。由於所有的X都是不同的,所以不同的是沒有你想要的效果 - 這是爲你的Top實體返回一個單獨的結果。 JPA要求讀回的每一行都以實體的形式返回,但是一些JPA提供者可以允許通過本地api來過濾。 – Chris 2013-03-07 18:31:18

0

ORDER BY子句中使用的字段必須是CMP字段,它們不能是實體標識符或CMR字段。另外,您必須小心在ORDER BY子句中指定了哪些CMP字段。如果查詢選擇實體集合,那麼ORDER BY子句只能用於所選實體類型的CMP字段。例如,以下查詢是非法的,因爲ORDER BY子句中使用的CMP字段不是所選實體類型的字段。

選擇對象(C) FROM客戶爲C ORDER BY c.address.city

由於城市CMP字段不是客戶EJB的直接CMP領域,你不能在使用ORDER BY它條款。您可以在ORDER BY子句中使用的唯一CMP字段是那些被選中的實體類型的直接CMP字段。這是一個不合理的限制。

類似的限制適用於CMP結果。 ORDER BY子句中使用的CMP字段必須與SELECT子句中標識的CMP字段相同。例如,以下查詢是非法的,因爲SELECT子句中標識的CMP與ORDER BY子句中使用的CMP不同。

SELECT c.address.city 從客戶爲C ORDER BY c.address.state

在上面的查詢,我們希望所有的城市,由國家有序的列表。不幸的是,這是非法的。如果您選擇使用城市CMP字段,則不能按狀態CMP字段排序。

我聽說第二個限制可能是因爲一個主要的RDBS系統的限制而被強迫的,而這個限制不能通過select子句中不存在的任何列進行排序 - 請記住,EJB QL被編譯爲本地查詢語言,在RDBS中是SQL。主要供應商的侷限性將是創建任何抽象的一個因素 - 最不常見的分母將佔上風。

+0

我從下面的文章中得到了答案http://www.theserverside.com/news/1321184/EJB-21-adds-new-functionality-to-EJB-QL-Monson-Haefels-Guide-to-我給你一個關於你的問題的解釋的Enterprise-JavaBeans,我希望這篇文章能夠闡明它。 – oggie0563 2013-03-06 05:58:59

+0

我沒有使用任何EJB。我只使用持久使用JPA(hibernate entitymanager)的POJO。在這種情況下,CMP和CMR意味着什麼? – 2013-03-06 22:06:38