首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

全面研讀 EJB 2.0 (中):EJB QL 查詢語言、ejbSelect 與 ejbHome 方法

     編輯:J2EE

EJB QL:可攜式查詢語言

  • 基於 SQL-92,由持久化管理器自動編譯
  • 用於實作 Local Home 介面的 `findByXXX` 方法
  • 部署描述符中宣告,提升 Entity Bean 可攜性與部署便利性

EJB QL 與 Finder 方法

Local Home 介面範例

public interface EmployeeHome extends javax.ejb.EJBHome {
    public Employee findByPrimaryKey(Integer id) ...  // 主鍵查詢無需 EJB QL
    public Collection findByZipCode(String zipcode) ...
    public Collection findByInvestment(String investmentName) ...
}

EJB QL 宣告 (部署描述符)

<query>
  <query-method>
    <method-name>findByZipCode</method-name>
    <method-params><method-param>java.lang.String</method-param></method-params>
  </query-method>
  <ejb-ql>FROM contactInfo WHERE contactInfo.zip = ?1</ejb-ql>
</query>

<query>
  <query-method>
    <method-name>findByInvestment</method-name>
    <method-params><method-param>java.lang.String</method-param></method-params>
  </query-method>
  <ejb-ql>FROM element IN benefit.investments WHERE element.name = ?1</ejb-ql>
</query>

關鍵規則

  • Finder 方法不需 SELECT 子句:固定回傳該 Bean 型別的 Remote 引用集合
  • 參數以 `?1`、`?2`... 表示,對應方法參數順序
  • 可跨越關聯導航至其他 Bean/Dependent 的抽象方案 (如 `benefit.investments`)

EJB QL 與 ejbSelect 方法 (選擇方法)

  • 僅供 Bean 類別內部使用,不曝露給客戶端
  • 回傳型別更靈活:Remote 型別、Dependent 物件、任意 Java 型別
  • 兩種範圍:
    • `ejbSelect<Method>InEntity`:針對當前 Entity 實例 (如該員工的風險投資)
    • `ejbSelect<Method>`:全域範圍 (所有員工的風險投資)
  • 必須在 Bean 類別宣告為 `abstract`,業務方法中呼叫

程式碼範例

public abstract class EmployeeBean implements javax.ejb.EntityBean {
    // InEntity 範圍
    public abstract Collection ejbSelectInvestmentsInEntity(String risk);
    // 全域範圍
    public abstract Collection ejbSelectInvestments(String risk);
}

對應 EJB QL

<!-- InEntity -->
<ejb-ql>SELECT invest FROM invest IN benefit.investments WHERE invest.type = ?1</ejb-ql>

<!-- 全域 -->
<ejb-ql>SELECT invest FROM invest IN benefit.investments WHERE invest.type = ?1</ejb-ql>
  <!-- 全域 select 不得回傳 Dependent 型別 -->

Select 方法關鍵差異

特性ejbSelect<M>InEntityejbSelect<M> (全域)
執行範圍當前 Entity 實例全域 (所有實例)
可回傳 Dependent是否
需 SELECT 子句是是

新增 ejbHome 方法

  • 針對整個 Entity Bean 類別的操作,非特定實例 (如批次更新)
  • Bean 類別實作 `ejbHome<Method>()`,Local Home 宣告對應 `()`
  • CMP 實作常依賴全域 `ejbSelect` 或 finder;BMP 直接存取資料庫

範例:依 COLA 調整所有員工薪資

// Local Home
public interface EmployeeHome extends javax.ejb.EJBHome {
    public void applyCola(double increase) throws RemoteException;
}

// Bean 實作
public abstract class EmployeeBean implements javax.ejb.EntityBean {
    public void ejbHomeApplyCola(double increase) {
        Collection col = ejbSelectAllEmployees();
        Iterator it = col.iterator();
        while (it.hasNext()) {
            Employee emp = (Employee) it.next();
            double salary = emp.getAnnualSalary();
            emp.setAnnualSalary(salary + salary * increase);
        }
    }
}

小結

EJB QL 標準化查詢定義,消除廠商專屬查詢語言差異;`ejbSelect` 提供 Bean 內部靈活查詢能力;`ejbHome` 賦予類別層級操作入口。三者結合大幅增強 CMP 2.0 的表達力與可攜性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved