JPA中的select子句中的查询 [英] Suqueries in select clause with JPA

查看:435
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆