Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

Enterprise JavaBeans查询语言

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

原著:Dale Green

  Enterprise JavaBeans查询语言(EJB QL)定义了容器管理持续化的finder方法和select方法的查询。作为SQL92的一个子 集,EJB QL进行了扩展,它可以使用entity bean的抽象模式中定义的关联。一个EJB QL查询可以跨越封装在同 一个EJB JAR文件中的所有相关的entity bean的抽象模式。

  你可以在entity bean中部署描述中定义EJB QL查询。典型的情况是,一个工具会将这些查询转换成低 层数据存储所使用的查询语言。因为这种转换的存在,使用容器管理持续化的entity bean具有可移植性--它们 的代码不受具体的数据存储的类型的影响。

1.术语

  下面列出了本章中用到的一些术语的定义。   
  • Abstract schema--抽象模式:一个entity bean的部署描述的一部分,它定义了bean的持 续化字段和关联关系。   
  • Abstract schema name--抽象模式名:在EJB QL查询中引用的一个逻辑命名。你需要为每个容 器管理持续化的entity bean指定一个抽象模式名。   
  • Abstract schema type--抽象模式类型:所有的EJB QL表达式都对应一个类型。如果表达式是 一个抽象模式名,那么它的类型默认是定义了这个抽象模式名的entity bean的local接口。   
  • Backus-Naur Form (BNF)--巴科斯-诺尔范式:一种描述高级语言语法的一种表示法。这一章 的语法图表使用了BNF表示法。   
  • navigation--跨越:在一个EJB QL表达式中对关联关系的使用。跨越操作符是一个句点。   
  • path expression--路径表达式:一个跨越到相关entity bean的表达式。   
  • persistent field--持续化字段:一个容器管理持续化的entity bean中的一个虚拟字段;它 存储在一个数据库中。   
  • relationship field--关联字段:一个容器管理持续化的entity bean中的一个虚拟字段;它 确定了一个相关的entity bean。

2.简单的语法

  这里简要地描述了EJB QL的语法,这样你可以快速进入下面查询示例的学习。如果你要对此进行更深入 的学习,请阅读完整的语法。

  一个EJB QL查询由三个子句组成:SELECT子句、FROM子句和 WHERE子句,SELECT子句和FROM子句是必选的,而 WHERE子句是可选的。下面是一个EJB QL查询的简单BNF定义:

EJB QL :: = select_clause from_clause [where_clause]
 
  SELECT子句定义了对象的类型或查询的返回值。返回类型可是一个local接口、一个remote 接口或是一个持续化字段。

  FROM子句通过声明一个或多个标识变量定义了查询的范围,这些标识变量可能会在 SELECT子句和WHERE子句中被引用。一个标识变量反映了下列元素之一:   

  • 一个entity bean的抽象模式名   
  • 一个集合的一个成员,这个集合是一个一对多关系中的多端

  WHERE子句是一个限制查询找到的对象或数值的条件表达式。尽管它是可选的,但是绝大 多数查询都会有一个WHERE子句。

3.查询示例

  下面的查询来自于RosterApp J2EE应用程序的PlayerEJB entity bean,在第六章中我们对这 个应用程序作了介绍。RosterApp中bean之间的关联关系,请参看图6-1。

3.1.简单的Finder查询

  如果你对EJB QL不熟悉,这些简单的查询将有助于你尽快入门。

示例 1
SELECT OBJECT(p)	
FROM Player p

  获得的数据:所有队员。

  Finder方法:findall()

  说明:FROM子句声明了一个名为p的标识变量,其中省略了可选的 AS关键字。如果使用了AS关键字,这个子句将是这样的:

FROM Player AS p
  Player元素是PlayerEJB entity bean的抽象模式名。因为bean在 LocalPlayerHome接口中定义了findall方法,所以这个查询返回的对象具有 LocalPlayer类型。

  参见:标识变量

示例 2
SELECT DISTINCT OBJECT(p)	
FROM Player p	
WHERE p.position = ?1

  获得的数据:由finder方法的参数指定位置的队员。

  Finder方法: findByPosition(String position)

  说明:在一个SELECT子句中,在例如p这样的独立的标识变量前面 要加OBJECT关键字。DISTINCT关键字排除了重复的数据。

  WHERE子句通过检查队员的position这个PlayerEJB entity bean的持续化字段对获得的队员进行了限制。?1元素表示了findByPosition方法 中的输入参数。

  参见:输入参数,DISTINCT关键字和OBJECT关键字

示例 3
SELECT DISTINCT OBJECT(p)	
FROM Player p	
WHERE p.position = ?1 AND p.name = ?2

  获得的数据:指定位置和姓名的队员。

  Finder方法: findByPositionAndName(String position, String name)

  说明:position元素和name元素是PlayerEJB entity bean的持续化字段。WHERE子句将这些字段与findByPositionAndName

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:Snort: 为你的企业规划入侵检测系统   下一篇:基于Linux的视频点播系统的实现

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号