Запустить запрос с предложением IN с помощью Criteria Builder - PullRequest
0 голосов
/ 12 июня 2019

Мне нужна помощь, чтобы выполнить приведенный ниже запрос, используя подход CriteriaBuilder:

select count(*) from TABLE_VIEW_SEARCH where
        person_ID in (select person_ID from TABLE_PERSON
        where region_ID = 1001) and postal_cd ='AL';

Я пытаюсь это сделать, но не получилось:

    CriteriaBuilder cb = ..;

    CriteriaQuery<Long> criteriaQuery= cb.createQuery(Long.class);

    Root<ViewSearchEntity> from= criteriaQuery.from(ViewSearchEntity.class);

    Subquery<Long> subQuery = criteriaQuery.subquery(Long.class);
    Root<PersonEntity> subFrom = subQuery .from(PersonEntity.class);

    subQuery .where(cb.equal(subFrom.get(PersonEntity_.region_ID ), region_ID ));

    criteriaQuery.select(cb.count(from));

    criteriaQuery.where(meFrom.in(subQuery );
    TypedQuery<Long> query = getEntityManager().createQuery(criteriaQuery);
    Long result = query.getSingleResult();

Я нашел решение, в основном яудалось выполнить условие соединения:

    CriteriaBuilder cb = ..;

    CriteriaQuery<Long> criteriaQuery= cb.createQuery(Long.class);

    Root<ViewSearchEntity> from= criteriaQuery.from(ViewSearchEntity.class);

    Predicate predicate1 = cb.equal(from.get(ViewSearchEntity.postal_cd),"AL");

    Subquery<Long> subQuery = criteriaQuery.subquery(Long.class);

    Root<PersonEntity> subRoot = subQuery.from(PersonEntity.class);

    Join<PersonEntity, RegionEntity_> region= subRoot.join(RegionEntity_.region);

    subQuery.select(region.get(RegionEntity_.regionId)).where(
            cb.equal(subRoot.get(PersonEntity_.region), regionId));

    Predicate predicateInClause = root.get(ViewSearchEntity_.postal_cd).in(subQuery);

    return getEntityManager().createQuery(criteriaQuery.select(cb.count(root)).where(predicate1,predicateInClause)).getEntityManager().createQuery(criteriaQuery.select(cb.count(root)).where(predicate1,predicateInClause))

1 Ответ

1 голос
/ 12 июня 2019

Как то так. Я не могу дать вам запрос из-за отсутствия имен сущностей. Тем не менее, я рекомендую прочитать этот подпункт Критерии API

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(TABLE_VIEW_SEARCH.class);
Root root = cq.from(TABLE_VIEW_SEARCH.class);

Subquery sub = cq.subquery(TABLE_PERSON.class);
Root subRoot = sub.from(TABLE_PERSON.class);
SetJoin<TABLE_PERSON, TABLE_VIEW_SEARCH> subViewSearch = 
     subRoot.join(TABLE_PERSON.tableViewSearch);
sub.select(cb.equal(subRoot.get(TABLE_PERSON.region_ID), 1001));

cq.where(cb.equal(root.get("postal_cd"), "AL"));

TypedQuery query = em.createQuery(cq);
List result = query.getResultList();

Вы можете использовать этот метод, как только у вас будет объявлена ​​зависимость генерации метамодели:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jpamodelgen</artifactId>
</dependency>

Перестройте свой проект с помощью maven после добавления этой зависимости, и тогда вы можете сделать это:

EntityName_.attribute
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...