基本概念
基於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();