【发布时间】:2011-07-16 02:46:58
【问题描述】:
我正在尝试在使用 JPA 2.0 类型安全标准 API 编写的应用程序中使用子查询,并使用 Hibernate 3.6.1.Final 作为我的提供者。我选择原始类型(Long、MyEntity 等)没有问题,但我想选择多个列。
这是一个完全合理的例子。忽略子查询的不必要使用——它只是为了说明。
EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> cq = cb.createTupleQuery();
Subquery<Tuple> subQ = cq.subquery(Tuple.class);
Expression<Long> subqCount;
{
Root<MyEntity> root = subQ.from(MyEntity.class);
Path<MyEntity> filter = root.get(MyEntity.challenge);
subqCount = cb.count(root);
// How to select tuple?
Selection<Tuple> tuple = cb.tuple(filter, subqCount);
// !! Run-time exception here
Expression<Tuple> tupleExpr = (Expression<Tuple>) tuple;
// Not sure why I can't use multiSelect on a subQuery
// #select only accepts Expression<Tuple>
createSubQ.select(tupleExpr);
createSubQ.groupBy(filter);
}
cq.multiselect(subqCount);
虽然编译器没有报错,但我还是遇到了运行时异常。
java.lang.ClassCastException: org.hibernate.ejb.criteria.expression.CompoundSelectionImpl cannot be cast to javax.persistence.criteria.Expression
- 这是休眠中的错误,还是我做错了什么?
- 如果您不能在子查询中使用
multiselect,那么如何执行groupBy? - 如果您不能在子查询中使用
groupBy,为什么要在 API 中使用它?
【问题讨论】:
-
我仍然没有找到这个问题的答案,我认为它仍然有效。
标签: jpa subquery criteria jpa-2.0 criteria-api