基本概念
基於ejb1.0或ejb1.1規範進行過ejb組件程式設計的讀者知道:ejb容器在自動創建容器管理持久性(cmp),實體類型ejb組件中查詢方法的資料庫查詢語言過程中沒有統一的規範可以遵循。這樣,不同的ejb容器創建的cmp組件查詢方法的查詢語句依賴於自行制訂的查詢語言規範,如 weblogic5.1定義了名稱為wlql的查詢語言。在這種情況下,如果該ejb組件的部署環境發生變化,ejb組件的完整實現代碼會相應地發生變化。
另外,ejb2.0規範在cmp實體類型ejb組件的定義中新增了容器管理關係欄位(container-managed relationship,cmr),用於表示實體組件代表的資料庫記錄之間的對應關係。但是,現有的任何查詢語言均無法實現在ejb組件的選擇方法中對 cmr欄位的內容進行遍歷(navigate)。
根據上述需求,ejb2.0規範定義了新型ejb組件查詢語言ejb ql。ejb容器開發商開發ejb容器時可以遵循統一的標準,使得ejb容器為cmp類型ejb組件中查詢方法和選擇方法創建的資料庫操作語句能夠被遵循 ejb2.0規範的其它ejb容器所兼容。ejb ql查詢語言的引入,不僅增強了查詢語言的功能,更重要的是提高了ejb組件的可移植性。
語法規則
ejb ql查詢語言的通用語法規則定義如下:
select [distinct] object(variable) from abstractschemaname [as] variable
[where value comparison value]
上述查詢語句包括三部分子句:select、from和where。select子句定義了該ejb ql查詢語句執行的操作類型並且能夠聲明查詢語句返回對象的數據類型;from子句定義了ejb ql語句的對象查詢範圍;where子句是查詢語句的可選項,用於標識查詢語句返回被查詢對象的條件。
◇select子句
select子句定義ejb ql語句要執行的操作類型並且通過該子句定義了返回對象的類型。例如下面的語句:
select object(p) from product p
該語句中product為xml部署描述檔案中定義的抽象模式名稱(abstract-schema-name),該名稱與product ejb組件相對應。上述語句返回當前ejb容器中的所有產品對象實例。如果在select關鍵字後附加"distinct"標識,則查詢語句將返回ejb 容器中具有唯一類型標識的product對象實例。
下面的查詢語句針對ejb組件間的容器管理關係返回符合條件的ejb組件對象實例:
select p.departmentstore from product as p
從上述查詢語句可以看到:利用as關鍵字將productejb組件對象的實例命名為p並且select關鍵字後面的內容說明返回與實例對象p對應的 departmentstore對象實例。從上述語句可以看出這樣的組件持久性關係:departmentstoreejb組件與productejb組件之間為“一對多”的對應關係。根據上面確定的兩個ejb組件之間的關係,看下面的ejb ql語句:
select store.product from product as p, in (p.departmentstore) store
上述查詢語句中,利用as關鍵字定義productejb組件對象實例名稱為p、與組件對象實例p對應的departmentstoreejb組件對象實例名稱為store,查詢語句返回與store對象對應的product對象實例。
◇from子句
from子句通過xml部署描述檔案中abstract-schema-name標識或ejb-name標識中的內容來定義查詢語句查詢的對象範圍。查詢對象的範圍可以用一種類型對象來確定,如前面第一個查詢語句中的"product p"字元串。另外,也可以通過對象實例間的對應關係來確定,如第三個查詢語句中的"product as p, in (p.departmentstore) store"字元串。
◇where子句
where子句通常由條件表達式構成,用於確定查詢語句返回對象的條件。看下面的例子:
select object (p) from product as p where p.price<100 and p.price>200
在上述查詢語句中,where子句的條件表達式"p.price<100 and p.price>200"與其它語言中的邏輯判斷表達式類似,表示查詢語句將返回價格在100和200之間的產品對象實例。
另外,由於ejb ql查詢語句是ejb組件類中定義的finder或select方法實現代碼中的資料庫操作語言,因此,ejb ql語句可以接收來自方法的參數,看下面select方法定義:
public abstract class departmentstorebean implements javax.ejb.entitybean {
public abstract java.util.collection
ejbselectproducts(int price)throws finderexception;
… …
}
相應地,在xml部署描述檔案中針對ejbselectproducts方法的ejb ql查詢語句代碼如下:
select object (store) from departmentstore as store
in (store.product) p where p.price = ?1
ejb ql查詢語句的where子句中"?1"字元串對應select方法定義中的整數類型參數price。同理,可以在select方法定義中定義多個方法參數,這樣,ejb ql查詢語句的where子句將由多個方法參數組成的對象條件判斷邏輯表達式構成。
如:
@SuppressWarnings("unchecked")
public List<Object> getObjectList(String string) {
return entityManager.createQuery("select obj from Object obj where obj .Dept=?").setParameter(1, string).getResultList();
}