我正在使用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)只有一些相等的字段。
任何人都可以告诉我它出错的地方或是否是错误?
答案 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);
您必须具有相同参数的构造函数