Подзапрос API критериев результата кортежа

Я пытаюсь использовать подзапросы в приложении, которое я пишу, используя API критериев безопасности типов JPA 2.0, с 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?
8
задан logan 15 March 2011 в 20:27
поделиться