Jakarta EE 程式設計/EJB-QL
外觀
EJB 查詢語言用於定義實體 Bean 的查詢方法應該返回什麼。EJB 1.1 規範沒有提供查詢實體 Bean 的方法。導致不同的應用程式伺服器使用不同的查詢語言。當 Sun 釋出 EJB 2.0 規範時,它添加了一種查詢語言,以便更輕鬆地查詢實體 Bean。
SELECT_CLAUSE FROM_CLAUSE [WHERE_CLAUSE]
必須使用 SELECT_CLAUSE 和 FROM_CLAUSE,但 WHERE_CLAUSE 是可選的。
查詢方法用於從儲存中返回一個或多個實體。查詢方法在實體的主介面中定義。查詢方法的返回值是 Bean 的遠端介面或實現遠端介面的實體 Bean 集合,這些實體 Bean 被找到。
最簡單的 EJB 查詢是返回給定表中的所有實體的查詢。
@ejb.finder signature="Collection findAll()" query="SELECT DISTINCT OBJECT(p) FROM Player p"
如您所見,EJB 查詢看起來幾乎與標準 SQL 查詢相同,儘管它不是表名,而是 EJB 類名,也不是列名,而是 EJB 屬性名。唯一的區別是終端 object(o),它等同於:獲取給定行的所有列,並將結果轉換為實體 Bean 例項。
檢視上面的示例。它與上面的查詢方法的不同之處在於,它添加了對要返回的球員的條件。
@ejb.finder signature="Collection findByPosition(java.lang.String position)" query="SELECT DISTINCT OBJECT(p) FROM Player p WHERE p.position = ?1"
此查詢方法返回所有在引數一中輸入的位置上比賽的球員。如果您有多個引數,您可以在查詢中使用它們,例如 ?2、?3 等。
當您想使用不同的關係表時,EJB 查詢與 SQL 的區別尤其明顯。
@ejb.finder signature="Collection findByCity(java.lang.String city)" query="SELECT DISTINCT OBJECT(p) FROM Player p, IN (p.teams) AS t WHERE t.city = ?1"
此查詢返回所有球隊在引數一中給定的城市比賽的球員。換句話說:返回所有在位於給定城市的球隊中比賽的球員。
與查詢方法相反,選擇方法可能會返回持久欄位或其他實體 Bean。因此,可以定義一個返回基本資料型別而不是完整物件的 select 方法。
