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> 
  
  
 
  |