【问题标题】:Toplink IN subqueryToplink IN 子查询
【发布时间】:2010-12-02 01:15:40
【问题描述】:

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

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

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

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

有什么想法吗?

非常感谢!

【问题讨论】:

  • +1 表示问题得到了很好的关注

标签: java jpa subquery jpql toplink


【解决方案1】:

我认为顺序错误,:event 不能在 IN 之前。

试试这个:

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

【讨论】:

  • 感谢您的回复,但我测试了它,但它不起作用。 “events”是一个列表,我认为 Toplink 不喜欢语法“events.id”。目前我做了一个本地 sql 查询来解决问题,但如果我找到这个查询的问题,我会告诉你。无论如何,感谢您花一些时间回答这个问题!
  • @ajeason 实际上我不确定 ejbql,我只知道 Hibernate HQL。在“events.id”中,“id”代表表的主键。如果您的主键列名为 pk_event,它可能是“events.pk_event”。 (我放“id”是因为 HQL 有“id”作为主键的通用快捷方式,但我认为这种行为不适用于 ejbql。)
  • 感谢您的回复,我会重新整理(有时间时...)我会告诉您 Toplink 语法!
【解决方案2】:

JPQL 查询的语法应该是:

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

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

4.6.8 在表达式中

使用的语法 比较运算符 [NOT] 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 为假, 并且等价于表达式 (o.country = ’UK’) OR (o.country = ’US’) OR (o.country = ’ France’).

o.country NOT IN (’UK’, ’US’, ’France’) 对于UK 为假,而为真 对于Peru,相当于 表达式NOT ((o.country = ’UK’) OR (o.country = ’US’) OR (o.country = ’France’))。

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

如果一个值 state_field_path_expression 在 IN 或 NOT IN 表达式中为 NULL 或 未知,表达式的值 未知。

【讨论】:

    猜你喜欢
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2010-10-23
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多