使用 JPA 的 select 子句中的查询 [英] Suqueries in select clause with JPA
本文介绍了使用 JPA 的 select 子句中的查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要在 Apache Openjpa 2 的 select 子句中执行子查询.JPA 是否支持 SELECT 子句中的子查询?
I need to execute a subquery in a select clause with Apache Openjpa 2. Does JPA support subqueries in SELECT clause?
我的查询是这样的:
SELECT t.date, t.value,
(SELECT COUNT(DISTINCT t2.value2) FROM table t2 WHERE t2.date = t.date)
FROM table t
WHERE ...
当我执行查询时,我得到一个类转换异常:
When I execute my query, I get a class cast exception:
Exception in thread "main" <openjpa-2.1.1-SNAPSHOT-r422266:1141200 nonfatal user error> org.apache.openjpa.persistence.ArgumentException:
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:872)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:794)
at org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:315)
at org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:331)
Caused by: java.lang.ClassCastException: org.apache.openjpa.jdbc.sql.LogicalUnion$UnionSelect incompatible with org.apache.openjpa.jdbc.sql.SelectImpl
at org.apache.openjpa.jdbc.sql.SelectImpl.setParent(SelectImpl.java:579)
at org.apache.openjpa.jdbc.kernel.exps.SelectConstructor.newSelect(SelectConstructor.java:147)
at org.apache.openjpa.jdbc.kernel.exps.SelectConstructor.evaluate(SelectConstructor.java:87)
at org.apache.openjpa.jdbc.kernel.exps.SubQ.appendTo(SubQ.java:209)
at org.apache.openjpa.jdbc.kernel.exps.SubQ.appendTo(SubQ.java:203)
at org.apache.openjpa.jdbc.kernel.exps.SubQ.newSQLBuffer(SubQ.java:167)
at org.apache.openjpa.jdbc.kernel.exps.SubQ.selectColumns(SubQ.java:153)
at org.apache.openjpa.jdbc.kernel.exps.SubQ.select(SubQ.java:148)
at org.apache.openjpa.jdbc.kernel.exps.SelectConstructor.select(SelectConstructor.java:372)
at org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.populateSelect(JDBCStoreQuery.java:295)
at org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.access$100(JDBCStoreQuery.java:86)
at org.apache.openjpa.jdbc.kernel.JDBCStoreQuery$1.select(JDBCStoreQuery.java:267)
at org.apache.openjpa.jdbc.sql.LogicalUnion.select(LogicalUnion.java:297)
at org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.populateUnion(JDBCStoreQuery.java:265)
at org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.executeQuery(JDBCStoreQuery.java:211)
at org.apache.openjpa.kernel.ExpressionStoreQuery$DataStoreExecutor.executeQuery(ExpressionStoreQuery.java:782)
at org.apache.openjpa.datacache.QueryCacheStoreQuery$QueryCacheExecutor.executeQuery(QueryCacheStoreQuery.java:346)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1005)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:863)
... 6 more
这是可能的还是我必须使用 NativeQuery/Single Queries?
Is this possible or do I have to use NativeQuery / Single Queries?
推荐答案
不,不支持在 SELECT 子句中使用子查询.在 JPA 2.0 规范中,这是用以下词语来说明的:
No, it is not supported to use subqueries in SELECT clause. In JPA 2.0 specification this is told with following words:
子查询可以用在 WHERE 或 HAVING 子句中.
Subqueries may be used in the WHERE or HAVING clauses.
这篇关于使用 JPA 的 select 子句中的查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文