动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.java 线程安全.
.Java应用中Hibernate对多表关联查.
.Java数据类型和与String之间的转.
.论全世界所有程序员都会犯的错误.
.[JAVA100例]039、生成PDF文件.
.安全的基础----学习java安全之前.
.反应灵敏的用户界面.
.setYear 方法.
.J2ME平台构件及开发应用程序示例.
.MC4J远程监测Tomcat集群-JMX助To.
.用Jbuilder 7开发EJB例程--开发S.
.Applet调用JavaScript函数.
.图解Java开发工具JBuilder 9.0.
.java开源项目研究.
.JDBC入门系列专题讲座.
.Thinking:Java中static、this、s.
.幸福的联姻:Java和Python.
.应用OSCache提升J2EE系统运行性能.
.EJB 3.0 开发指南之依赖值对象.
.漫谈EJB——Enterprise JavaBean.

EJB查询语言

发表日期:2008-1-5 |



  一、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
上一篇:全面研读 EJB 2.0 人气:453
下一篇:XDoclet:EJB开发好帮手 人气:581
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-10 企业网站智能管理系统(TZIMS) v6
2008-10-10 拓文asp.net网站内容管理系统 v6
2008-10-10 动网论坛PHP版 v2.0++ Build 081
2008-10-10 免费时代CMS v5.0
2008-10-10 wodig第四季中文DIGG社区 v4.1 b
2008-10-10 老Y文章管理系统 v2.2 bulid 081
2008-10-10 魔法盒动感相册 ASP+SQL版 v2.0
2008-10-10 Asoft签到管理系统 v3.0 Pack1
2008-10-10 哥特人音乐网潮流留言本 v1.1
2008-9-29 酷狗音乐(原KuGoo)2008 v5.310 正
2008-9-29 QQTab 1.1
2008-9-29 网络传送带 Net Transport 2.64a
2008-9-29 谷歌金山词霸v1.8
2008-9-29 TweakVI 1.0 Build 1090
2008-9-29 ACDSee Pro 2.5 Build 333 汉化绿
2008-9-29 Winamp v5.541(2189) 周明波简体
2008-9-27 CCleaner 2.12.651
2008-9-27 Mozilla Thunderbird 2.0.0.17 英
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号