使用 EclipseLink 在 Oracle 上执行查询时出现奇怪的行为

Posted

技术标签:

【中文标题】使用 EclipseLink 在 Oracle 上执行查询时出现奇怪的行为【英文标题】:Strange behaviour when executing query on Oracle with EclipseLink 【发布时间】:2012-07-10 13:30:44 【问题描述】:

我创建了一个命名查询如下:

SELECT o
FROM TableName1Entity o , TableName2Entity a
WHERE o.field1 = a.field4
AND a.field5 = :param1

即转化为如下sql:

SELECT TABLE_NAME1.FIELD1, TABLE_NAME1.FIELD2, TABLE_NAME1.FIELD3
FROM TABLE_NAME2 t0, TABLE_NAME1 t1
WHERE ((t0.FIELD4 = t1.FIELD1)
AND (t0.FIELD5 = ?));

它返回ORA-00904: "TABLE_NAME1"."FIELD3": invalid identifier

但是当我手动修改如下时它可以工作:(它们都按预期工作)

SELECT t1.FIELD1, t1.FIELD2, t1.FIELD3
FROM TABLE_NAME2 t0, TABLE_NAME1 t1
WHERE ((t0.FIELD4 = t1.FIELD1)
AND (t0.FIELD5 = ?));

SELECT TABLE_NAME1.FIELD1, TABLE_NAME1.FIELD2, TABLE_NAME1.FIELD3
FROM TABLE_NAME2 t0, TABLE_NAME1
WHERE ((t0.FIELD4 = TABLE_NAME1.FIELD1)
AND (t0.FIELD5 = ?));

SELECT FIELD1, FIELD2, FIELD3
FROM TABLE_NAME2 t0, TABLE_NAME1 t1
WHERE ((t0.FIELD4 = t1.FIELD1) AND (t0.FIELD5 = ?));

SELECT FIELD1, FIELD2, FIELD3
FROM TABLE_NAME2 t0, TABLE_NAME1
WHERE ((t0.FIELD4 = TABLE_NAME1.FIELD1)
AND (t0.FIELD5 = ?));

PS.:出于安全原因,我不能给出表格或字段名称。

问题是:当表名与标签一起显式设置时,查询不起作用。

请不要通过更改命名查询来提供替代解决方案 因为它应该没问题,并且更改命名查询不是 选项。除非它真的有错误。

【问题讨论】:

您没有显示命名查询;命名查询属于 ORM 的世界,并且不是用 SQL 编写的(SQL 具有这样的别名 label 用于表)。看what is a named query 而 JPA 实现是?因为将 JPQL 查询转换为 SQL 完全与实现相关 JPA 1.0.2 与 EclipseLink 1.1.1 【参考方案1】:

您所做的称为别名:表TABLE_NAME 在查询的选择部分中必须引用为label,因为这是查询的其余部分命名(和查看)表的方式。

所以你必须写这样的东西:

SELECT label.FIELD_NAME FROM TABLE_NAME label;

【讨论】:

好的,但我无法控制命名查询的转换方式。 :/ 查询被自动转换,就像第一个例子一样。【参考方案2】:

将 EclipseLink 的版本从 1.1.1 更改为 2.0.0

【讨论】:

以上是关于使用 EclipseLink 在 Oracle 上执行查询时出现奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 中的 Spring Data JPA + EclipseLink

Up-to-date cache with EclipseLink and Oracle

JPA - EclipseLink - 如何更改默认模式

带有容器管理事务的 EclipseLink - persist() 不提交

使用 Sniffy 指定的 Oracle URL 无效

JPA + EclipseLink+ HSQLDB 不创建表