count * с предложением where с использованием запроса критериев JPA

Я хочу найти записи для таблицы related_elements, где RelationshipId принадлежит списку

предположим, что Set tempSet содержит [2,3,4]. Я должен проверить, содержится ли это значение в таблице related_element, используя запрос критериев jpa.

CriteriaBuilder cb1=entityManager.getCriteriaBuilder();
        CriteriaQuery<RelatedElements> cq1=cb1.createQuery(RelatedElements.class);
        Root<RelatedElements> RelatedElementsRoot=cq1.from(RelatedElements.class);
    for (Integer tSet : tempSet) {
            ParameterExpression<Integer> pRelatedElement=cb1.parameter(Integer.class);
            cq1.multiselect(cb1.count(RelatedElementsRoot.<RelatedElements>get("relatedElementsPk").<Integer>get("relationId"))).where(cb1.equal(RelatedElementsRoot.get("relationId"), pRelatedElement));
            TypedQuery<RelatedElements> qry = entityManager.createQuery(cq1);
            qry.setParameter(pRelatedElement, tSet);
            count = entityManager.createQuery(cq1).getSingleResult().getRelationId();
        }

но теперь он работает ... любые предложения

вторая попытка

CriteriaBuilder cb1=entityManager.getCriteriaBuilder();
        CriteriaQuery<Integer> cq1 = cb1.createQuery(Integer.class);
        Root<RelatedElements> RelatedElementsRoot=cq1.from(RelatedElements.class);
        for (Integer tSet : tempSet) {
            ParameterExpression<Integer> pRelatedElement=cb1.parameter(Integer.class);
            cq1.multiselect(cb1.count(cq1.from(RelatedElements.class)));
            cq1.where((cb1.equal(RelatedElementsRoot.get("relatedElementsPk").get("relationId"), pRelatedElement)));
            TypedQuery<Integer> qry = entityManager.createQuery(cq1);
            qry.setParameter(pRelatedElement, tSet);
            count =qry.getSingleResult();
        }

его исключение в qry.setParameter

Невозможно найти соответствующий конструктор в классе [java.lang.Integer] [выберите новый java.lang.Integer (count (*)) из com.mcd.webex.model.RelatedElements как generatedAlias0, com.mcd.webex.model.RelatedElements как generatedAlias1, где generatedAlias0.relatedElementsPk.relationId =: param0]


person Surya    schedule 04.10.2013    source источник
comment
Не могли бы вы показать свои строковые данные cq1?   -  person Peerapat A    schedule 04.10.2013


Ответы (3)


Как задокументировано, CriteriaBuilder.count возвращает Expression<java.lang.Long>. Следовательно, аргумент типа для CriteriaQuery и TypedQuery также должен быть Long. То же самое верно и для типа переменной count.

Если нужно выбрать только одно значение, имеет смысл использовать CriteriaQuery.select вместо multiselect, потому что тогда такая ошибка перехватывается уже во время компиляции.

Long count;
...
CriteriaQuery<Long> cq1 = cb1.createQuery(Long.class);
...
cq1.select(cb1.count(cq1.from(RelatedElements.class)));
...
TypedQuery<Long> qry = entityManager.createQuery(cq1);
person Mikko Maunu    schedule 04.10.2013

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Root<Dzialy> root = cq.from(Dzialy.class);
EntityType <Dzialy> Dzialy_ = root.getModel();

cq.select((cb.countDistinct(root)));
cq.where( cb.equal( root.get(Dzialy_.getSingularAttribute("DZI_id")), 1) ); 

long l = em.createQuery(cq).getSingleResult();

em - EntityManager
DZI_id - имя столбца
1 - значение поиска
Dzialy - класс сущности

person milosz    schedule 16.01.2014
comment
Спасибо! Я обнаружил, что cq.select(qb.count(cq.from(Entity.class))); не работает правильно, когда вводится ограничение where. Но ваш метод работает отлично. - person ravindu1024; 01.08.2020

person    schedule
comment
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего поста. Помните, что вы отвечаете на вопрос для читателей в будущем, и эти люди могут не знать причины вашего предложения кода. - person DimaSan; 10.03.2017