Toplink IN子查询

时间:2009-09-28 16:02:33

标签: java jpa subquery jpql toplink

我有2个对象通过oneToMany关系关联(“一个模型可以有很多事件”)。

我正在尝试在ejbql中创建一个子查询来查找一个事件的模型,如下所示:

SELECT model 
FROM RegModelValue model 
WHERE :event IN (model.events) 

.... 但toplink doent识别模型别名并告诉我“内部例外:第1:129行:意外令牌:模型”

有什么想法吗?

非常感谢提前!

2 个答案:

答案 0 :(得分:0)

我认为订单有误,:event不能在IN之前。

试试这个:

    SELECT model 
    FROM RegModelValue model 
    JOIN model.events events
    WHERE events.id = :event

答案 1 :(得分:0)

您的JPQL查询的语法应为:

SELECT model 
FROM RegModelValue model 
WHERE model.events IN (:event)

下面是JPA 1.0规范的相关部分:

  

4.6.8在表达式中

     

使用的语法   比较运算符[NOT] IN in a   条件表达式如下:

in_expression ::=
    state_field_path_expression [NOT] IN ( in_item {, in_item}* | subquery)
in_item ::= literal | input_parameter
     

state_field_path_expression   必须有字符串,数字或枚举   值。文字和/或   input_parameter值必须是这样的   相同的抽象模式类型   类型中的 state_field_path_expression 。 (见4.12节)。

     

子查询的结果必须是   喜欢相同的抽象模式类型   中的 state_field_path_expression   类型。子查询在中讨论   第4.6.15节“子查询”。

     

例如:

     

o.country IN (’UK’, ’US’, ’France’)   UK为真,Peru为false,   并且相当于表达式   (o.country = ’UK’) OR (o.country = ’US’) OR (o.country = ’ France’)

     o.country NOT IN (’UK’, ’US’, ’France’)

UK为false,为true   对于Peru,并且相当于   表达NOT ((o.country = ’UK’) OR (o.country = ’US’) OR (o.country = ’France’))

     

必须至少有一个元素   以逗号分隔的列表定义   IN的值集   表达

     

如果是a的值   IN或NOT IN表达式中的 state_field_path_expression NULL或   未知,表达的价值   不明。