【问题标题】:Eclipselink UNION + SELECT NEWEclipselink UNION + SELECT NEW
【发布时间】:2014-04-23 23:44:04
【问题描述】:

我正在使用 eclipselink 2.4.2。我必须执行一个使用 UNION 和 SELECT NEW 子句的查询。

我的 jpa 查询是这样的:

SELECT new com.*.*.MyObject(s.field1, s.field2, s.field3) 
FROM MyEntityBean1 s WHERE s.someField = :someField UNION SELECT 
new com.*.*.MyObject(s.field1, s.field2, s.field3) 
FROM MyEntityBean2 s WHERE s.someField = :someField UNION SELECT ...

但是 eclipselink 在这个 sql 查询中对其进行了转换:

SELECT t0.COLUMN1, t0.COLUMN2, ... FROM 
TABLE1 t1 WHERE (t1.COLUMN3 = ?) 
UNION (SELECT  FROM TABLE2 t2 WHERE (t2.COLUMN3 = ?)) UNION (...)

如您所见,第二个选择(和其他选择)为空,因此我收到此错误:

内部异常:java.sql.SQLSyntaxErrorException:ORA-00936: 缺少表达

如果不使用 SELECT NEW,我不会收到此错误,但我需要它,因为我在查询中使用的表(和 EntityBean)只有一些相等的字段。

谁能告诉我哪里出了问题或者是不是bug?

【问题讨论】:

    标签: sql jpa eclipselink union


    【解决方案1】:

    我找到了解决方案:

    SELECT new com.*.*.MyObject(s.field1, s.field2, s.field3) 
    FROM MyEntityBean1 s WHERE s.someField = :someField UNION SELECT 
    s.field1, s.field2, s.field3 
    FROM MyEntityBean2 s WHERE s.someField = :someField UNION SELECT ...
    

    只有第一个 SELECT 必须有 NEW 运算符。

    现在我还有一个问题,我该如何使用

    订购方式

    关于这个查询?

    我试过了:

    SELECT s FROM (
    SELECT new com.*.*.MyObject(s.field1, s.field2, s.field3) 
    FROM MyEntityBean1 s WHERE s.someField = :someField UNION SELECT 
    s.field1, s.field2, s.field3 
    FROM MyEntityBean2 s WHERE s.someField = :someField UNION SELECT ...
    ) s ORDER BY s.someField
    

    但我收到此错误:

    子表达式中缺少右括号。一个 必须为范围变量提供标识变量 声明。

    有什么建议吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多