代码之家  ›  专栏  ›  技术社区  ›  Yishai

这是有效的EJB-QL吗?

  •  2
  • Yishai  · 技术社区  · 14 年前

    在EJB-QL中,我有以下几个EJB2.1查找器方法:

    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))

    查询本身在JBoss4.2上运行良好(返回预期结果)。这里的想法都是湿的,还是查询有有效的问题?对于这样的查询,实际首选的可选语法是什么?

    编辑:感谢所有回答者的帮助,特别是罗曼。我报告说这是 issue 对喷气式飞机。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Romain Hippeau    14 年前

    这个查询很好——看起来像是一个IDEA代码检查器问题。
    我找不到任何记录在案的错误。

    如果你有付费版本,你可能会问他们的支持。

    我确实发现了一个小问题,在EJB2.1的规范(以及所有其他相关的规范)中,它说使用大写表示空。

    11.2.6.10空比较表达式
    条件表达式中使用比较运算符的语法为空,如下所示: 单值_路径_表达式输入_参数为[非]空 空比较表达式测试单值路径表达式或输入参数是否为空值。

    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
    

    下面是EJB2.1规范中与您的查询匹配的部分…

    11.2.5.3范围变量声明 用于将标识变量声明为范围变量的EJBql语法与SQL的语法类似;或者,它使用as关键字。

    range_variable_声明::=abstract_schema_name[as]与实体bean相关的标识符对象或值通常通过使用路径表达式的导航获得。但是,导航并不能到达所有对象。范围变量声明允许bean 提供程序为导航可能无法到达的对象指定一个__root_157;。 如果bean提供程序希望通过比较实体bean抽象模式类型的多个实例来选择值,那么在FROM子句中需要多个范围在抽象模式类型上的标识变量。

    以下finder方法查询返回数量大于john smith订单数量的订单。这个例子说明了在FROM子句中使用两个不同的标识变量,这两个变量都是抽象模式类型顺序。此查询的select子句确定返回的是数量大于john smith_s的订单。

    SELECT DISTINCT OBJECT(o1)
    FROM Order o1, Order o2
    WHERE o1.quantity > o2.quantity AND
    o2.customer.lastname = ‘Smith’ AND
    o2.customer.firstname= ‘John’
    
        2
  •  1
  •   Michael Konietzka    14 年前

    假设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
    
        3
  •  0
  •   stacker    14 年前

    我会将这些查询与以下官方资源进行比较 BNF Grammar of EJB QL 对于J2EE1.3(因为您提到了EJB2.1)

    对于最新的JEE5规范 Full Query Language Syntax

    推荐文章