加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

jpa – 元组结果Criteria API子查询

发布时间:2020-12-15 02:59:56 所属栏目:Java 来源:网络整理
导读:我试图在我正在使用JPA 2.0类型安全标准API编写的应用程序中使用子查询,Hibernate 3.6.1.Final作为我的提供者.我没有选择原始类型(Long,MyEntity等)的问题,但我想选择多个列. 这是一个完全合理的例子.忽略子查询的不必要使用 – 它仅仅是说明性的. EntityMan
我试图在我正在使用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

>这是休眠中的错误,还是我做错了什么?
>如果您不能在子查询上使用多选,那么如何执行groupBy?
>如果您不能在子查询上使用groupBy,为什么它在API中?

解决方法

我也有同样的问题.

我只能尝试回答你的上一个问题,说你只能使用子查询来执行非常简单的查询,例如:

SELECT name FROM Pets WHERE Pets.ownerID in (
    SELECT ID FROM owners WHERE owners.Country = "SOUTH AFRICA"
)

我想说的另一件事是这件事让我想起了xkcd #979.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读