Eclipselink UNION + SELECT NEW

时间:2014-03-18 10:42:06

标签: sql jpa eclipselink union

我正在使用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,我不会收到此错误,但我需要它,因为我在查询中使用的表(和EntityBeans)只有一些相等的字段。

任何人都可以告诉我它出错的地方或是否是错误?

2 个答案:

答案 0 :(得分:2)

我找到了解决方案:

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运算符。

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

  

ORDER BY

关于此查询?

我试过了:

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

但是我收到了这个错误:

  

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

有什么建议吗?

答案 1 :(得分:0)

为org.hibernate.Query 的org.hibernate.Session

session.createQuery("从Bean")中选择新的BEAN(id,name,phone,coreBusiness);

您必须具有相同参数的构造函数