技术开发 频道

Enterprise JavaBeans查询语言(三)

【IT168 技术文档】

标识变量
 
  一个标识变量就是在FROM子句中声明的一个标识符。尽管SELECT子句和WHERE子句中可以引用标识变量,但是不可以声明它。所有的标识变量都只能在FROM子句中声明。
 
  因为一个标识变量就是一个标识符,所以它与标识符具有同样的命名约定和约束。例如,一个标识变量是对大小写不敏感的,它不可以与一个EJB QL关键字相同。(更多的命名规则请参见上一段。)同样,在一个给定的EJB JAR文件中,一个标识命名也不能与任何entity bean的命名或抽象模式名重复。
 
  FROM子句可以包含用逗号隔开的多个声明。一个声明可以引用另一个在前面(左边)已经声明的标识变量。在下面的FROM子句中,变量t引用了之前声明的变量p:
 
FROM Player p, IN (p.teams) AS t
 
  即使一个标识变量没有在WHERE子句中引用,它的声明也可以影响到查询的结果。我们可以来比较下面的两个查询。下面的查询返回所有的队员,不论他们是否属于一个运动队:
 
SELECT OBJECT(p)
 
FROM Player p
 
与此相反,因为下一个查询声明了t标识变量,它可以获得属于一个运动队的所有队员:
 
SELECT OBJECT(p)
 
FROM Player p, IN (p.teams) AS t
 
下面的查询返回了与上一个查询相同的结果,但是WHERE子句的存在使得这个查询更容易理解:
 
SELECT OBJECT(p)
 
FROM Player p
 
WHERE p.teams IS NOT EMPTY
 
一个标识变量总是指向一个单独的值,它的类型是声明中使用的表达式。有两个类型的声明:范围变量和集合成员。
 
范围变量声明
 
  要将一个标识变量声明为一个抽象模式类型,你必须指定一个范围变量申明。换句话说,一个标识变量可以包括一个entity bean的抽象模式类型。在下面的例子中,一个名为p的标识变量表示了一个名为Player的抽象模式:
 
FROM Player p
 
一个范围变量声明可以包括可选的AS操作符:
 
FROM Player AS p
 
  在绝大多数情况下,为了获得对象,查询会使用路径表达式以跨越关联关系。但是对于那些不能通过跨越获得的对象,你可以使用一个范围变量声明以指定一个起点(或root)。
 
如果查询对同一抽象模式名的多个值进行比较,那么FROM子句需要为这个抽象模式声明多个标识变量:
 
FROM Player p1, Player p2
 
作为这样一个查询的示例,请参看示例 9。
 
集合成员声明
 
  在一个一对多的关联关系中,多端由一个entity bean的集合组成。一个标识变量可以反映这个集合中的一个成员。要访问一个集合成员,变量声明中的路径表达式将跨越抽象模式中的关联关系。(在下面我们将详细介绍路径表达式。)因为一个路径表达式可以基于另一个路径表达式,所以可以实现对几个关联关系的跨越。参见示例 6。
 
一个集合成员声明必须包含IN操作符,不过它可以省略可选的AS操作符。
 
在下面的例子中,抽象模式名为Player的entity bean有一个名为teams的关联字段。名为t的标识变量代表了teams集合中的一个成员。
 
FROM Player p, IN (p.teams) AS t
 
路径表达式
 
  从几个方面说,路径表达式都是EJB QL语法中的重要的构造。首先,它们定义了在抽象模式的关联关系中的跨越路径。这些路径的定义既影响查询的范围,也影响查询的结果。其次,它们可以在一个EJB QL查询的三个子句(SELECT、WHERE和FROM)的任何一个中出现。最后,尽管EJB QL中的很大部分都是SQL的子集,但是路径表达式却不是SQL中所具有的。
 
语法
 
有两种类型的路径表达式:single-valued和collection-valued。下面是路径表达式的语法:
 
single_valued_path_expression ::=
 
{single_valued_navigation |
 
identification_variable}.cmp_field |
 
single_valued_navigation
 
single_valued_navigation ::=
 
identification_variable.[single_valued_cmr_field.]*
 
single_valued_cmr_field
 
collection_valued_path_expression ::=
 
identification_variable.[single_valued_cmr_field.]*
 
collection_valued_cmr_field
 
  在前面的语法结构中,cmp_field元素表示了一个持续化字段,而cmr_field元素表示了一个关联字段。术语single_valued限制关联字段只能是一对一关系或一对多关系中端;反之,术语collection_valued限制关联字段为多端。
 
  路径表达式中的句点(.)有两个功能。如果句点出现在一个持续化字段之前,它是字段和标识变量之间的分隔符。而如果句点是出现在一个关联字段之前,那么它是跨越操作符。
 
示例
 
在下面的查询中,WHERE子句包含了一了single-valued表达式。p是一个标识变量,而salary是Player的一个持续化字段。
 
SELECT DISTINCT OBJECT(p)
 
FROM Player p
 
WHERE p.salary BETWEEN ?1 AND ?2
 
下一个例子的WHERE子句也包含了一个single-valued表达式。t是一个标识变量,league是一个single-valued关联字段,而sport是league的一个持续化字段。
 
SELECT DISTINCT OBJECT(p)
 
FROM Player p, IN (p.teams) AS t
 
WHERE t.league.sport = ?1
 
在下面的查询中,WHERE子句包含了一个collection-valued表达式。p是一个标识变量,而teams是一个collection-valued关联字段。
 
SELECT DISTINCT OBJECT(p)
 
FROM Player p
 
WHERE p.teams IS EMPTY
 
表达式类型
 
一个表达式的类型就是最后的元素所对应的对象的类型,它可以有以下几种:
 
1、持续化字段
 
2、Single-valued关联字段
 
3、Collection-valued关联字段
 
例如,表达式p.salary的类型是double,这是因为最后的持续化字段(salary)的类型为double。
 
  在表达式p.teams中,最后的元素是一个collection-valued关联字段(teams)。那么这个表达式的值就是一个名为Team的抽象模式类型的集合。因为Team是TeamEJB entity bean的抽象模式命名,所以这个类型映射到bean的local接口LocalTeam。有关抽象模式映射的类型,参见返回类型。
 
跨越
 
  路径表达式的存在使得查询可以跨越到相关的entity bean。一个表达式中最后的元素决定了是否可以进行遗址。如果一个表达式包含了一个single-valued关联字段,那么可以继续跨越到与该字段相关的对象。然而,一个表达式不能作超过一个持续化字段或是一个collection-valued关联字段的跨越。例如,表达式p.teams.league.sport就是非法的,因为teams是一个collection-valued关联字段。要访问sport字段,FROM子句必须为teams字段定义一个名为t的标识变量:
 
FROM Player AS p, IN (p.teams) t
 
WHERE t.league.sport = ´soccer´
 
WHERE子句
 
  WHERE子句指定了一个限制查询返回值的条件表达式。查询返回所有数据存储中使得条件表达式为TRUE的值。尽管经常使用,但是事实上WHERE子句是可选的。如果WHERE子句被省略,那么查询会返回所有的值。WHERE子句的高级语法如下:
 
Where_clause ::= WHERE conditional_expression
 
常量
 
有三种类型的常量:字符串型、数值型和布尔型。
 
字符串型常数
 
一个字符串型常量用一组单引号引出:
 
´Duke´
 
如果一个字符串本身就包含一个单引号,你可以通过使用两个单引号来表示它:
 
´Duke´´s´
 
和一个Java String一样,一个EJB QL中的字符串常量使用Unicode字符编码。
 
数值型常量
 
有两种类型的数值型常量:精确型和近似型。
 
  一个精确型数值常量是一个没有小数点的数字,例如65、-233和+12。使用Java整数的语法,精确型数值常量可以支持Java long范围内的数字;一个近似型数值常量是一个使用科学记数法的数字,例如57.、-85.7和+2.1。使用Java浮点常量的语法,近似型数值常量可以支持Java double范围内的数字。
 
布尔型常量
 
一个布尔型常量是TRUE或FALSE。这些关键字是对大小写不敏感的。
 
输入参数
 
一个输入参数标志为问号(?)后加整数。例如,第一个输入参数是?1,第二个是?2,依此类推。
 
输入参数必须遵守以下规则:
 
1、它们只可以应用于一个WHERE子句中。
 
2、它们的使用只限于一个条件表达式中的single-valued路径表达式。
 
3、它们必须是有限的,并以整数1开始。
 
4、WHERE子句中输入参数的数目不可以超过相应的finder方法或select方法中的输入参数的数目。
 
5、WHERE子句中输入参数的类型必须与相应的finder方法和select方法的参数匹配。
0
相关文章