这是有效的EJB-QL吗?

时间:2010-04-22 14:23:09

标签: java java-ee ejb ejbql ejb-2.x

我在EJB-QL中有以下几个EJB 2.1 finder方法的构造:

SELECT distinct OBJECT(rd) FROM RequestDetail rd, DetailResponse dr 
      WHERE dr.updateReqResponseParentID is not null 
      and dr.updateReqResponseParentID = ?1 
      and rd.requestDetailID = dr.requestDetailID
      and rd.deleted is null and dr.deleted is null

IDEA的EJB-QL检查标记了对两个对象FROM RequestDetail rd, DetailResponse dr的使用,并进行了检查:Several ranged variable declarations are not supported, use collection member declarations instead (e.g. IN(o.lineItems))

查询本身在JBoss 4.2上运行正常(与预期结果一样)。 IDEA在这里是否都是湿的,或者查询是否存在有效问题?这种查询的实际首选替代语法是什么?

编辑:感谢所有回答的人的帮助,尤其是罗曼。我将此报告为JetBrains的issue

3 个答案:

答案 0 :(得分:2)

查询很好 - 它看起来像IDEA Code Inspector问题 我找不到任何针对它的错误。

如果您有付费版本,可能需要他们的支持。

我确实发现了一个小问题,在EJB 2.1的规范中(以及所有其他问题),它说使用大写字母表示NULL。

11.2.6.10空比较表达式
在条件表达式中使用比较运算符IS NULL的语法如下: {single_valued_pa​​th_expression | input_parameter} IS [NOT] NULL 空比较表达式测试单值路径表达式或输入参数是否为NULL值。

SELECT distinct OBJECT(rd) FROM RequestDetail rd, DetailResponse dr 
      WHERE dr.updateReqResponseParentID IS NOT NULL 
      and dr.updateReqResponseParentID = ?1 
      and rd.requestDetailID = dr.requestDetailID
      and rd.deleted IS NULL and dr.deleted IS NULL

以下是EJB 2.1规范中与您的查询匹配的部分......

11.2.5.3范围变量声明 用于将标识变量声明为范围变量的EJB QL语法类似于SQL的语法;可选地,它使用AS关键字。

range_variable_declaration :: = abstract_schema_name [AS]标识符通常通过使用路径表达式导航来获取与实体bean相关的对象或值。但是,导航无法到达所有对象。范围变量声明允许Bean 提供者为可能无法通过导航访问的对象指定“根”。 如果Bean Provider想要通过比较实体bean抽象模式类型的多个实例来选择值,则在FROM子句中需要多于一个覆盖抽象模式类型的标识变量。

以下finder方法查询返回数量大于John Smith订单数量的订单。此示例说明了在FROM子句中使用两个不同的标识变量,两者都是抽象模式类型Order。此查询的SELECT子句确定它是返回的数量大于John Smith的订单。

SELECT DISTINCT OBJECT(o1)
FROM Order o1, Order o2
WHERE o1.quantity > o2.quantity AND
o2.customer.lastname = ‘Smith’ AND
o2.customer.firstname= ‘John’

答案 1 :(得分:1)

假设detailResponse是一个关联字段的名称,其值是DetailResponse实例的集合,您可以通过关联字段进行导航:

  SELECT distinct OBJECT(rd) FROM RequestDetail rd IN (rd.detailResponse) dr WHERE
  dr.updateReqResponseParentID is not null and dr.updateReqResponseParentID = ?1 
  and rd.deleted id null and dr.deleted is null

答案 2 :(得分:0)

我会将查询与J2EE 1.3的官方资源BNF Grammar of EJB QL进行比较(因为您提到了EJB2.1)

有关JEE5 Full Query Language Syntax

的更新规范
相关问题