我在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。
答案 0 :(得分:2)
查询很好 - 它看起来像IDEA Code Inspector问题 我找不到任何针对它的错误。
如果您有付费版本,可能需要他们的支持。
我确实发现了一个小问题,在EJB 2.1的规范中(以及所有其他问题),它说使用大写字母表示NULL。
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
以下是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
的更新规范