log*_*gan 8 jpa criteria subquery criteria-api jpa-2.0
我试图在我正在使用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);
Run Code Online (Sandbox Code Playgroud)
虽然编译器没有抱怨,但我仍然遇到运行时异常.
java.lang.ClassCastException: org.hibernate.ejb.criteria.expression.CompoundSelectionImpl cannot be cast to javax.persistence.criteria.Expression
Run Code Online (Sandbox Code Playgroud)
multiselect在子查询上使用,那你怎么能执行groupBy?groupBy在子查询上使用,为什么它在API中?小智 5
我也有同样的问题。
我只能尝试回答你的最后一个问题,说你只能真正使用子查询来执行非常简单的查询,例如:
SELECT name FROM Pets WHERE Pets.ownerID in (
SELECT ID FROM owners WHERE owners.Country = "SOUTH AFRICA"
)
Run Code Online (Sandbox Code Playgroud)
我想说的另一件事是这件事让我想起了xkcd #979。
| 归档时间: |
|
| 查看次数: |
6839 次 |
| 最近记录: |