Как использовать IN с JPA CriteriaBuilder - PullRequest
0 голосов
/ 06 ноября 2018

Я использую JPA и имею объект Building с полями Owner и BuildingType. Я хочу найти все здания, в которых находится владелец, в списке и конкретный тип здания.

 List<Owner> owners;
    BuildingType type;
    CriteriaBuilder builder = getCriteriaBuilder();
    CriteriaQuery<Building> criteria = builder.createQuery(Building.class);
    Root<Building> rootBuilding = criteria.from(Building.class);
    criteria.select(rootBuilding);
    criteria.where( builder.equal( rootBuilding.get( _buildingType ), buildingType ) );

Последняя строка кода работает для buildingType, но для списка владельцев что?

1 Ответ

0 голосов
/ 06 ноября 2018

Описание:

  • Сначала нужно убедиться, что у вас есть список идентификаторов владельцев, а не список владельцев;
  • тогда вы можете присоединиться к владельцу и BuildingType и составить список предикатов для них.
  • наконец выберите корень, который находится на объекте Building

Решение:

List<Long> ownerIds; //include Id of owners you want
BuildingType type;  //include the type you want 
CriteriaBuilder builder = getSessionFactory().getCurrentSession().getCriteriaBuilder();
CriteriaQuery < Building > criteria = builder.createQuery(Building.class);
Root < Building > myObjectRoot = criteria.from(Building.class);
Join < Building, Owner > joinOwner = myObjectRoot.join("owner");
Join < Building, BuilderType > joinBuilderType = myObjectRoot.join("buildingType");

List < Predicate > predicates = new ArrayList < Predicate > ();
predicates.add(builder.equal(joinBuilderType.get("id"), type.getId()))
predicates.add(builder.in(joinOwner.get("id")).value(ownerIds))
criteria.select(myObjectRoot);
criteria.where(builder.and(predicates.toArray(new Predicate[predicates.size()])));
return entityManager.createQuery(criteria).getResultList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...