2010-04-22 37 views
2

我有以下構建EJB-QL幾個EJB 2.1 finder方法:這是否有效的EJB-QL?

SELECT distinct OBJECT(rd) FROM RequestDetail rd, DetailResponse dr 
     WHERE dr.updateReqResponseParentID is not null 
     and dr.updateReqResponseParentID = ?1 
     and rd.requestDetailID = dr.requestDetailID 
     and rd.deleted is null and dr.deleted is null 

IDEA的EJB-QL檢驗標誌有檢查使用兩個對象FROM RequestDetail rd, DetailResponse dr的它說:Several ranged variable declarations are not supported, use collection member declarations instead (e.g. IN(o.lineItems))

的查詢它們本身在JBoss 4.2上運行良好(作爲對預期結果的回報)。 IDEA全部都在這裏,或者查詢中是否存在有效問題?這種查詢的實際首選替代語法是什麼?

編輯:感謝所有回答的人的幫助,尤其是羅曼。我向JetBrains報告這是一個issue

+0

您使用的是什麼版本的IDEA? - 看起來他們過去確實遇到了一些問題,現在看不到網站正在維護中。 – 2010-05-02 04:17:46

+0

@Romain,我正在使用9.0.2 – Yishai 2010-05-02 19:51:55

+0

您的代碼中有沒有其他地方通過EJB-QL進行連接? – 2010-05-02 23:29:06

回答

2

查詢是好的 - 它看起來像一個想法碼督察ector問題。
我找不到任何針對它記錄的錯誤。

如果您有付費版本,您可能需要諮詢他們的支持。

我確實發現了一個小問題,在EJB 2.1的規範(以及所有其他方面)中,它說NULL使用大寫字母。

11.2.6.10空比較表達式
對於使用比較操作符的語法是在條件表達式NULL如下: {single_valued_pa​​th_expression | input_parameter} IS [NOT] NULL 空比較表達式測試單值路徑表達式或輸入參數是否爲NULL值。

SELECT distinct OBJECT(rd) FROM RequestDetail rd, DetailResponse dr 
     WHERE dr.updateReqResponseParentID IS NOT NULL 
     and dr.updateReqResponseParentID = ?1 
     and rd.requestDetailID = dr.requestDetailID 
     and rd.deleted IS NULL and dr.deleted IS NULL 

下面是從EJB 2.1規範符合您查詢的一個部分......

11.2.5.3範圍變量聲明爲 聲明的標識變量範圍變量的EJB QL語法類似於SQL的;可選地,它使用AS關鍵字。

range_variable_declaration :: = abstract_schema_name [AS]標識符與實體bean相關的對象或值通常通過使用路徑表達式進行導航獲得。但是,導航無法觸及所有對象。範圍變量聲明允許Bean 提供程序爲可能無法通過導航訪問的對象指定「根」。 如果Bean提供者想要通過比較實體bean抽象模式類型的多個實例來選擇值,那麼在FROM子句中需要多於一個標識變量,其範圍超過抽象模式類型。

以下查找方法查詢返回數量大於John Smith訂單數量的訂單。此示例說明在FROM子句中使用兩個不同的標識變量,這兩個抽象模式類型都是Order。此查詢的SELECT子句確定它是返回數量大於John Smith's的訂單。

SELECT DISTINCT OBJECT(o1) 
FROM Order o1, Order o2 
WHERE o1.quantity > o2.quantity AND 
o2.customer.lastname = ‘Smith’ AND 
o2.customer.firstname= ‘John’ 
+0

謝謝,我懷疑null是一個問題,但我會嘗試改變它,看看是否使檢查器更加智能,但如果它是有效的EJB-QL,那麼我想我會向他們開放一個問題。 – Yishai 2010-05-02 19:52:39

+0

我接受這個答案,但應該注意,null不是問題,因爲11.2.5.1指出「保留的標識符不區分大小寫」。並在此之上包含NULL作爲標識符。 – Yishai 2010-05-03 15:00:10

1

假設detailResponse是一個關聯的名稱 - 場,其值是DetailResponse的實例的集合,你可以爲這個通過關聯字段導航:

SELECT distinct OBJECT(rd) FROM RequestDetail rd IN (rd.detailResponse) dr WHERE 
    dr.updateReqResponseParentID is not null and dr.updateReqResponseParentID = ?1 
    and rd.deleted id null and dr.deleted is null