技术开发 频道

详解Enterprise JavaBeans查询语言之二

条件表达式
  
  一个WHERE子句由一个条件表达式组成,它的优先级顺序为从左至右。你可以通过使用圆括号改变这个顺序。
  
  下面是条件表达式的语法:
  
  conditional_expression
  ::= conditional_term |
      conditional_expression
   OR conditional_term
  
  conditional_term
  ::= conditional_factor |
      conditional_term
   AND conditional_factor
  
  conditional_factor
  ::= [ NOT ] conditional_test
  
  conditional_test
  :: = conditional_primary
  
  conditional_primary
  ::=
      simple_cond_expression
   | (conditional_expression)
  
  simple_cond_expression
  ::=
      comparison_expression |
      between_expression |
      like_expression |
      in_expression |
      null_comparison_expression |
      empty_collection_comparison_expression |
      collection_member_expression
  
BETWEEN表达式
  
  一个BETWEEN表达式确定一个算术表达式是否属于某一数值范围。BETWEEN表达式的语法如下:
  
  between_expression
  ::=
      arithmetic_expression
   [NOT] BETWEEN
      arithmetic_expression
   AND arithmetic_expression
  
  这两个表达式是等价的:
  
  p.age BETWEEN 15 AND 19
  p.age >= 15 AND p.age <= 19
  
  这两个表达式也是等价的:
  
  p.age NOT BETWEEN 15 AND 19
  p.age < 15 OR p.age > 19
  
  如果一个算术表达式有一个NULL值,那么BETWEEN表达式的值未知。
  
IN表达式
  
  一个IN表达式确定一个字符串是否属于一组字符串常量。下面是IN表达式的语法:
  
  in_expression ::=
      single_valued_path_expression
      [NOT] IN (string_literal
   [, string_literal]* )
  
  上述的single-valued path expression必须有一个String值。如果该single-valued path expression有一个NULL值,那么IN表达式的值未知。
  
  在下面的例子中,如果国家是UK,那么表达式是TRUE。如果国家是Peru,则表达式是FALSE。
  
  o.country IN ('UK', 'US', 'France')
  
LIKE表达式
  
  一个LIKE表达式确定一个通配符模型是否匹配一个字符串。下面是语法:
  
  like_expression ::=
      single_valued_path_expression
      [NOT] LIKE pattern_value
   [ESCAPE escape-character]
    上述的single-valued path
  
  expression必须有一个String值。如果这个值是NULL,那么LIKE表达式的值未知。通配符模型是一个可以包含通配符的字符串常量。下划线(_)表示任何一个单独的字符。百分号(%) 表示零个或多个字符。ESCAPE子句指定了一个通配符模型中的一个转义字符。
  
NULL比较表达式
  
  一个NULL比较表达式检验一个single-valued路径表达式是否有一个NULL值。通常,这个表达式用来检验一个single-valued关联关系是否被设定。如果一个路径在运算过程中包含了一个NULL值,那么它将返回NULL值。下面是一个NULL比较表达式的语法:
  
  null_comparison_expression
  ::=
      single_valued_path_expression
   IS [NOT] NULL
  
空集比较表达式
  
  一个空集比较表达式检验一个collection-valued路径表达式是否包含元素。换句话说,它检验一个collection-valued关联关系是否被建立。下面是语法:
  
  empty_collection_comparison_expression
  ::= collection_valued_path_expression IS
  [NOT] EMPTY
  
  如果collection-valued路径表达式是NULL,那么空集比较表达式的值也为NULL。
  
  集合成员表达式
  
  集合成员表达式确定一个值是否是集合中的成员。这个值必须与集合成员是同一类型。表达式的语法如下:
  
  collection_member_expression
  ::=
      {single_valued_navigation
   | identification_variable |
      input_parameter}
      [NOT] MEMBER [OF]
   collection_valued_path_expression
  
  如果collection-valued路径表达式是未知的,那么集合成员表达式的结果也是未知的。如果collection-valued路径对应一个空集,那么集合成员表达式的结果是FALSE。
  
等同性规定
  
  在EJB QL中,只有同一类型的值可以进行比较。但是,这个规则有一个例外:精确型数值与近似型数值之间可以进行比较。在这样的比较中,所需的类型转换遵守Java的有关规定。
  
  EJB QL对数值进行比较时,将它们视为Java类型,而不是它们在底层数据存储中的持续化类型。例如,如果一个持续化字段既可以是整型也可以是NULL,那么它必须定义为一个Integer对象,而不是一个int简单变量。只是因为只有Java对象才能为NULL,而一个简单变量不可以。
  
  两个字符串只有在它们包含完全相等的字符序列时才被视为相等。这时你注意空格的存在变得很重要;例如,字符串'abc'和'abc '就是不相等的。
  
  两个具有相同抽象模式类型的entity bean只有在它们的主键的值相同时才被视为相等。
  
SELECT子句
  
  SELECT子句定义了查询返回的对象或值的类型。SELECT子句的语法如下:
  
  select_clause ::= SELECT [DISTINCT]
      {single_valued_path_expression |
      OBJECT(identification_variable)}
  
返回类型
  
  SELECT子句定义的返回类型必须与这个查询为之定义的finder方法或select方法匹配。对于finder方法查询,SELECT子句的返回类型是定义这个finder方法的entity bean的抽象模式类型。
  
  这个抽象模式类型映射到一个remote接口或local接口。如果是bean的remote home接口定义了这个finder方法,返回类型就是remote接口(或remote接口的结果集)。同样的,如果local home接口定义了这个finder方法,返回类型就是local接口(或local接口的结果集)。例如,PlayerEJB entity bean的LocalPlayerHome接口定义了findall方法:
  
  public Collection findAll()
  throws FinderException;
  
  findall方法的EJB QL查询返回LocalPlayer接口类型的结果集:
  
  SELECT OBJECT(p)
  FROM Player p
  
  对于select方法查询,SELECT子句的返回类型可以是以下情况中的一种:
  
  1、包含这个select方法entity bean的抽象模式。
  
  2、相关entity bean的抽象模式。(默认的情况是每一个这样的抽象模式类型映射到entity bean的local接口,尽管不常见,但是在这种情况下,你可能需要通过在部署描述中指定一个remote接口以重载这个默认的映射。)
  
  3、一个持续化字段
  
  例如,PlayerEJB entity bean实现的ejbSelectSports方法返回一个相应于sport的String对象的结果集。sport就是LeagueEJB entity bean的一个持续化字段。参见示例 11.
  
  一个SELECT子句不能指定一个collection-valued表达式。例如,在SELECT子句中,p.teams就是非法的,这是因为teams是一个集合但是下面查询中的SELECT子句是有效的,这是因为t是teams集合中的单个元素:
  
  SELECT t
  FROM Player p,
  IN (p.teams) AS t
  
DISTINCT关键字和OBJECT关键字
  
  DISTINCT关键字用来去除返回值中的重复值。如果这个查询的方法返回一个java.util.Collection--它允许重复--那么你必须指定DISTINCT关键字以去除重复值。但是,如果方法返回一个java.util.Set,DISTINCT关键字就是多余的,这是因为java.util.Set不可以包含重复值。
  
  在一个单独的标识变量前必须使用OBJECT关键字,但是在一个single-valued路么表达式前不需要使用它。如果一个标识变量是一个single-valued路径表达式的一部分,那么它不被认为是单独的。
  
EJB QL约束
  
  EJB QL有以下约束:
  
  1、不允许用注释。
  
  2、日期和时间值精确到毫秒级并使用Java long类型。一个日期和时间常量必须是一个整型常量。要生成毫秒值,你可以使用java.util.Calendar类。
  
  3、通常情况下。容器管理持续化不支持继承。因为这个原因,两个不同类型的entity bean不能进行比较。
0
相关文章