国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

EJB查詢語言

2019-11-18 12:35:29
字體:
來源:轉載
供稿:網友

  一、EJB查詢語言
  
  
  EJB 1.1規范沒有為CMP實體Bean(容器治理持久化的實體Bean)的查找器方法提供一種定義查詢的標準,因此,各個EJB容器廠商分別為實體Bean的查找器方法定義了各自的查詢語法。例如,BEA的WebLogic application Server v5.1定義了一種稱為WLQL的查詢語言。
  
  
  由于這個原因,當應用從一個廠商的應用服務器移植到另一個廠商的應用服務器時,開發者必須重新為查找器方法定義查詢。顯然,這限制了帶有CMP實體Bean的應用的可移植性。
  
  
  另外,EJB 1.1規范也沒有為CMP實體Bean在各種不同的代碼上下文、關系或關聯條件下與其它實體Bean的交互提供標準的方法,沒有一種合適的機制可以用來定義那些從一個實體Bean導航到它所依靠的類以及這些類的成員變量的查詢。
  
  
  EJB 2.0規范通過定義EJB查詢語言(EJB Query Language)來解決這些問題。EJB QL以SQL-92規范為基礎,用來為CMP實體Bean定義各種查找器方法和select方法的查詢。EJB QL查詢語句由三個子句構成:SELECT子句,FROM子句,WHERE子句。EJB QL的用途之一是,通過在部署描述器中引入抽象模式類型和關系,它為定義實體Bean以及依靠類之間的關系提供了一種標準化的方法。另外,EJB QL還能夠用抽象模式名字和關系為導航操作定義查詢。
  
  
  下面是EJB QL查詢的基本語法格式:
  
  
  EJB QL查詢 ::= SELECT子句 FROM子句 [WHERE子句]
  
  
  EJB QL查詢必須包含SELECT和FROM子句,但WHERE子句是可選的。FROM子句聲明了基于抽象模式名字的符號變量,SELECT子句利用這些符號變量定義查詢的返回值類型,而WHERE子句則定義了查詢的條件。
  
  
  在部署描述器中,EJB QL查詢用標記定義,如下所示:
  
  
  查找器方法或select方法的名字在元素中指定,參數在元素中指定。元素指定了返回值類型,可以包含本地值或遠程值。查詢字符串在元素中聲明。查找器方法和select方法用EJB QL定義查詢,所以下面我將簡略地介紹一下這兩個概念。EJB 2.0規范定義了實體Bean的查找器方法和select方法,其中select方法是該規范新增的內容。
  
  
  查找器方法(Finder Method):查找器方法通過關系數據庫系統從持久性存儲系統中提取出一個實體Bean的實例,或者一個實體Bean實例的集合。這些方法將在實體Bean的Home接口列出,因此,客戶程序可以看到它們。Home接口既可以是遠程的EJBHome,也可以是本地的EJBLocalHome。在遠程Home接口中,查找器方法的返回類型或者是實體Bean的遠程接口,或者是一個實現實體Bean遠程接口的對象的集合。在本地Home接口中,查找器方法的返回值類型或者是實體Bean的本地接口,或者是一個實現實體Bean本地接口的對象的集合。例如:
  
  
  // 遠程Home接口
  
  public interface OrderHome extends javax.ejb.EJBHome {
  
  ...
  
  public Order findByPRimaryKey(int orderId) throws FinderException,RemoteException;
  
  public Order findByBiggestOrder() throws FinderException,RemoteException;
  
  public java.util.Collection findAllOrders(String supplierName) throws FinderException,RemoteException;
  
  }
  
  // 本地Home接口
  
  public interface OrderHome extends javax.ejb.EJBLocalHome {
  
  ...
  
  public Order findByPrimaryKey(int orderId) throws FinderException;
  
  public Order findBiggestOrder() throws FinderException;
  
  public java.util.Collection findAllOrders(String supplierName) throws FinderException;
  
  }
  
  select方法(Select Method):在實體Bean中,select方法作為一種非凡類型的查尋方法存在。這些方法不在Home接口中聲明,因此客戶程序不能直接訪問它們。對于訪問cmp-field或者在cmr-field中定義的任何遠程接口實例來說,查找器方法不是很有用。利用select方法,實體Bean可返回cmp-field類型的實例,或由cmr-field描述的遠程接口。
  
  
  select方法通常有下面兩種類型:
  
  ejbSelect
  ejbSelectInEntity
  
  
  例如:
  
  public abstract class OrderBean implements javax.ejb.EntityBean {
  
  ...
  
  public abstract java.util.Collection ejbSelectAllOrderedProdUCts(Date date)
  
  throws FinderException;
  
  ...
  
  public abstract java.util.Collection ejbSelectAllOrderedProductsInEntity(Date date)
  
  throws FinderException;
  
  }
  
  
  ejbSelect不關聯到實體Bean的特定實例。因此,在上面的例子中,ejbSelectAllOrderedProducts方法返回一個集合,其中包含與所有訂單關聯的所有產品。ejbSelectInEntity面向特定的實體Bean實例執行,前面例子中的ejbSelectAllOrderProductsInEntity方法返回與該OrderBean實例關聯的所有產品。
  
  我們將以訂單處理應用為例,具體介紹EJB QL查詢的各個子句。圖一顯示了OrderEJB、LineItemEJB、ProductEJB和AddressEJB之間的關系:
  EJB查詢語言
  在部署描述器中,上述關系的定義如下:
  
  
  
  
  
  Order-LineItem
  
  
  order-has-lineitems
  
  One
  
  OrderEJB
  
  
  lineItems
  java.util.Collection
  
  
  
  
  
  lineitem-belongsto-order
  
  Many
  
  
  LineItemEJB
  
  
  order
  
  
  
  
  Product-LineItem
  
  product-has-lineitems
  One
  
  ProductEJB
  
  
  
  lineitem-for-product
  Many
  
  LineItemEJB
  
  
  product
  
  
  二、FROM子句
  
  
  FROM子句通過聲明符號變量,定義了查詢的范圍。符號變量不能在SELECT子句和WHERE子句中聲明,SELECT子句和WHERE子句只能使用FROM子句中定義的符號變量。一個FROM子句中可以定義多個符號變量。
  
  
  任何合法的標識符都可以用作符號變量,但也存在一些限制。例如,符號變量的名字不能與抽象模式名字或EJB名字相同。另外,符號變量名字不應該是保留的符號,保留的符號包括:SELECT,FROM,WHERE,DISTINCT,OBJECT,NULL,TRUE,FALSE,NOT,AND,OR,BETWEEN,LIKE,IN,AS,UNKNOWN,EMPTY,MEMBER,OF以及IS。符號變量的名字是大小寫敏感的。
  
  
  符號變量聲明包括范圍變量聲明和集合成員變量聲明。下面,我們將分析一個簡單的查詢命令,它的FROM子句既包括范圍變量聲明,也包括集合變量聲明。要選擇出所有包含“Floppy Drive”產品的訂單,查詢是:
  
  
  SELECT OBJECT(o) FROM Order o, IN (o.lineItems) li
  
  WHERE li.product.product_type='Floppy Drive'
  
  
  在這個例子中,FROM子句把“o”標識符聲明為一個范圍變量,把標識符“li”聲明為一個集合成員變量。范圍變量聲明了抽象模式類型。聲明集合成員變量要用到:
  
  
  保留符號“IN”,
  
  范圍變量的抽象模式類型,以及
  
  關聯的實體Bean的抽象模式類型。
  
  范圍變量“o”指示了抽象模式類型Order。類似地,符號變量“li”是LineItem抽象模式類型,li.product是Product抽象模式類型。WHERE子句中的li.product.product_type是java.lang.String類型。在EJB QL查詢語言中,所有子句的分析和計算都是從左到右進行,因此,符號變量“li”利用了前面聲明的“o”。在SELECT子句中的OBJECT符號是必須的,因為要用OBJECT操作符來限定和修飾SELECT子句中的所有獨立的符號變量。
  
  
  范圍變量還可以使用可選的符號AS聲明。也就是說,上面例子中的FROM子句也可以改寫成:
  
  
  FROM Order AS o, IN (o.lineItems) li
  
  
  另外,一個FROM子句可以定義一個以上的范圍變量。例如:
  
  
  FROM Order AS o, IN (o.lineItems) li, Product p
  三、WHERE子句
  
  
  WHERE子句定義了選擇結果中的對象或值必須滿足的條件表達式。下面是WHERE子句的語法:
  
  
  WHERE子句 ::= WHERE 條件表達式
  
  
  在EJB QL查詢語言中,WHERE子句中的所有符號變量必需在FROM子句中聲明。查找器方法和select方法的輸入參數也在這里傳入。輸入參數由一個問號(“?”)前綴指示,問號的后面加上方法聲明中參數的序號(例如:?1,?2,等等)。
  
  
  public abstract class OrderBean implements javax.ejb.EntityBean {
  
  ...
  
  //method-a
  
  public abstract java.util.Collection ejbSelectLineItems(int quantity)
  
  throws FinderException;
  
  ...
  
  //method-b
  
  public abstract java.util.Collection ejbSelectAllProducts(String product_type, double

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 陈巴尔虎旗| 高陵县| 宜昌市| 墨脱县| 乐山市| 关岭| 延长县| 茌平县| 延庆县| 封开县| 建德市| 乃东县| 鄂伦春自治旗| 册亨县| 四子王旗| 长葛市| 于田县| 北辰区| 靖江市| 泰兴市| 泰顺县| 巴彦淖尔市| 天峨县| 郸城县| 揭阳市| 南川市| 广宁县| 泰州市| 柞水县| 宁波市| 九寨沟县| 信丰县| 林周县| 石狮市| 赫章县| 阿克陶县| 丰原市| 宝鸡市| 昌邑市| 灵璧县| 汽车|