JBoss 对于EJB QL扩展的三种形式

类别:Java 点击:0 评论:0 推荐:


JBoss 对于EJB QL扩展的三种形式


Author: sam sha
Email : [email protected]
Date: 2004-3-18


EJB 2.0 规范后,提供了一个种描述实体bean查找的方法,这个语言被称为EJB QL。EJB QL 类似于 SQL, 但是做了修改以支持EJB的概念,同时,为了易于在众多ejb服务器上实现,删减了许多功能。
在2.0版本上,支持的功能还有限。一个EJB查询仅支持SELECT,FROM,WHERE三个子句。
举例说明:MySQL 表news,后面均以此表为例。
news
{
 id int(4)
 title varchar(100)
 content text
 issuedate date
}

EJB QL 一般用法:“SELECT OBJECT(p) FROM ENewsCMP AS p WHERE p.id = ?1”

 对应CMP实体bean,命名为ENewsCMP。

 由于EJB QL 的功能实在有限,比如,连个ORDER BY都不支持,所以一些ejb服务器纷纷扩展了EJB QL 功能。

 JBoss对于EJB QL的扩展有三种<jboss-ql>, <dynamic-ql>,  <declared-sql>.

 一.JBossQL 比较简单,修改jbosscmp-jdbc.xml

――――jbosscmp-jdbc.xml――――――――――
 <entity>
      <ejb-name>ENewsCMP</ejb-name>
  。。。
 <query>
        <query-method>
          <method-name>findByAll_jbossql</method-name>
          <method-params />
        </query-method>
        <jboss-ql>SELECT OBJECT(p) FROM ENewsCMP AS p ORDER BY p.id DESC</jboss-ql>
      </query>
 </entity>
―――――――――――――――――――――― 
上述定义需要在ejb-jar.xml中同时定义。
――――ejb-jar.xml――――――――――
 <entity>
      <ejb-name>ENewsCMP</ejb-name>
  。。。
 <query>
        <query-method>
          <method-name>findByAll_jbossql</method-name>
          <method-params />
        </query-method>
         <ejb-ql />
      </query>
 </entity>
――――――――――――――――― 
调用:
 ENewsCMPHome enHome = null;
    ENewsCMP en = null;
 Context context = new InitialContext(environment);

   Object ref = context.lookup("ENewsCMP");
    enHome = (ENewsCMPHome) ref;
    Collection coll = null;
coll = enHome. findByAll_jbossql(3);
   

 二.DynamicQL
 
――――jbosscmp-jdbc.xml――――――――――
 <entity>
      <ejb-name>ENewsCMP</ejb-name>
  。。。
 <query>
        <query-method>
          <method-name>ejbSelect_dynamicql</method-name>
          <method-params>
            <method-param>java.lang.String</method-param>
            <method-param>java.lang.Object[]</method-param>
          </method-params>
        </query-method>
        <dynamic-ql />
    </query>
 </entity>
―――――――――――――――――――――― 
注意:用jbuilderx 1.0开发这个配置总被删掉

 上述定义需要在ejb-jar.xml中同时定义。
――――ejb-jar.xml――――――――――
 <entity>
      <ejb-name>ENewsCMP</ejb-name>
  。。。
   <query>
        <query-method>
          <method-name>ejbSelect_dynamicql</method-name>
          <method-params>
            <method-param>java.lang.String</method-param>
            <method-param>java.lang.Object[]</method-param>
          </method-params>
        </query-method>
        <ejb-ql />
</query>
 </entity>
――――――――――――――――― 

实现:
public abstract class ENewsCMPBean
    implements EntityBean {
。。。
 public abstract Collection ejbSelect_dynamicql(String jbossQl, Object[] arguments) throws     FinderException;
/*
The DynamicQL ejbSelect method may have any valid ejbSelect method name, but the method
must always take a String and Object array as parameters.
*/

 public Collection ejbHomeGetNews_dynamicql (int newsid) {
    StringBuffer jbossQl = new StringBuffer();
     jbossQl.append("SELECT OBJECT(p) ");
     jbossQl.append("FROM ENewsCMP AS p ");
     if (newsid != -1)
       jbossQl.append("WHERE p.id = ?1");
     jbossQl.append("ORDER BY p.id DESC");
     Object[] args = new Integer[1];
     args[0] = new Integer(newsid);

    System.out.println("ejbHomeGetNews ....");
    try {
      return this.ejbSelect_dynamicql(jbossQl.toString(), args);
    }
    catch (FinderException ex) {
      return null;
    }

  }

public interface ENewsCMPHome
    extends EJBLocalHome {

public Collection getNews_dynamicql (int newsid);

调用:
 ENewsCMPHome enHome = null;
    ENewsCMP en = null;
 Context context = new InitialContext(environment);

   Object ref = context.lookup("ENewsCMP");
    enHome = (ENewsCMPHome) ref;
    Collection coll = null;
 int newsid = 1;//data number
coll = enHome. enHome.getNews_dynamicql(newsid);
三.DeclaredSQL

――――jbosscmp-jdbc.xml――――――――――
 <entity>
      <ejb-name>ENewsCMP</ejb-name>
  。。。
 <query>
        <query-method>
          <method-name>ejbSelect_declare</method-name>
          <method-params>
            <method-param>int</method-param>
          </method-params>
        </query-method>
        <declared-sql>
          <select>
            <distinct />
            <ejb-name>ENewsCMP</ejb-name>
            <alias>p</alias>
          </select>
          <where>p.id > {0}</where>
   <order>p.id DESC</order>
        </declared-sql>
      </query>
 </entity>
―――――――――――――――――――――― 
注意:举例中仅为一个CMP bean,所以没有配置<from/>。

 上述定义需要在ejb-jar.xml中同时定义。
――――ejb-jar.xml――――――――――
 <entity>
      <ejb-name>ENewsCMP</ejb-name>
  。。。
<query>
        <query-method>
          <method-name>ejbSelect_declare</method-name>
          <method-params>
            <method-param>int</method-param>
          </method-params>
        </query-method>
        <ejb-ql />
</query>
 </entity>
――――――――――――――――― 

实现:
public abstract class ENewsCMPBean
    implements EntityBean {
。。。
 public abstract Collection ejbSelect_declare(int newsid) throws  FinderException;

 public Collection ejbHomeGetNews_declare(int newsid) {
    try {
      return this.ejbSelect_declare(newsid);
    }
    catch (FinderException ex) {
      return null;
    }
  }
 }

public interface ENewsCMPHome
    extends EJBLocalHome {

public Collection getNews_declare(int newsid);

调用:
 ENewsCMPHome enHome = null;
    ENewsCMP en = null;
 Context context = new InitialContext(environment);

   Object ref = context.lookup("ENewsCMP");
    enHome = (ENewsCMPHome) ref;
    Collection coll = null;
 int newsid = 1;//data number
coll = enHome. enHome.getNews_declare(newsid);

 

上述为JBoss对于EJB QL的扩展,个人感觉EJB QL会不断进行扩充,也许各容器的扩展只是一种暂时行为。另外,也许由于JBuilderX1.0对于JBoss 3.2.3的支持有些问题,发现修改配置文件的时间比编码时间还要长可能是J2EE开发的一个特点:(。

参考资料:<JBossCMP>


 

本文地址:http://com.8s8s.com/it/it16730.htm