Сбор атрибутов тестирования в JPA CriteriaBuilder - PullRequest
0 голосов
/ 08 октября 2010

У меня есть CriteriaBuilder, и я пытаюсь создать предикат для ограничения результатов в CollectionAttribute.Я хотел бы сказать что-то вроде получения всех сущностей в этой коллекции, где атрибут сущности A равен x.Например, у меня есть много сущностей людей.У них есть коллекция должностей (предыдущая и текущая), и я хотел бы знать обо всех людях, которые имели звание «банкир».Вот пример:

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Object> query = builder.createQuery();
Root<MheAreaLocation> root = query.from(MheAreaLocation.class);

Predicate p2 = builder.equal(root.get(Jobs_.jobs).get(Jobs_.titles), "banker");

TypedQuery<Object> q = em.createQuery(query);
List<Object> resultList = q.getResultList();
...

Любая помощь будет отличной.Я изо всех сил пытаюсь найти много о CollectionAttribute и использовать их в предикатах ... и я продолжаю получать пустые значения, когда использую соединение в предикате ниже :-( Спасибо

Это мой фактический код:

CriteriaBuilder builder = em.getCriteriaBuilder();
// CriteriaQuery<Tuple> query = builder.createQuery();
CriteriaQuery<Object> query = builder.createQuery();
Root<MheAreaLocation> mheAreaLocationRoot = query.from(MheAreaLocation.class);

CollectionJoin<MheLocation, AtlasLocationGroupMap> join = mheAreaLocationRoot.join(MheAreaLocation_.childLocation).join(MheLocation_.atlasLocationGroupMapCollection);
// .join(AtlasLocationGroupMap_.atlasLocationGroup, JoinType.INNER);

Predicate p1 = builder.equal(mheAreaLocationRoot.get(MheAreaLocation_.parentLocation).get(MheLocation_.mheLocId), "AZP1B");
// Predicate p2 = builder.equal(mheAreaLocationRoot.get(MheAreaLocation_.childLocation).get(MheLocation_.atlasLocationGroupMapCollection).);
Predicate p2 = builder.equal(join.get(AtlasLocationGroupMap_.atlasLocationGroup).get(AtlasLocationGroup_.locationGroupType), "NEXT_STATION");

// query.where(builder.and(e1, e2));

// mheAreaLocationRoot.fetch(MheAreaLocation_.childLocation);
// join.fetch(MheLocation_.atlasLocationGroupMapCollection);

// query.multiselect(mheAreaLocationRoot.get(MheAreaLocation_.parentLocation),
// mheAreaLocationRoot.get(MheAreaLocation_.childLocation));
// query.select(builder.tuple(join.get(AtlasLocationGroupMap_.mheLocation)));

TypedQuery<Object> q = em.createQuery(query);
List<Object> resultList = q.getResultList();
...

Другие классы (я могу добавить больше при необходимости):

@StaticMetamodel(MheLocation.class)
public class MheLocation_ { 
   public static volatile CollectionAttribute<MheLocation, AtlasLocationGroupMap> atlasLocationGroupMapCollection;
   public static volatile SingularAttribute<MheLocation, String> mheLocId;
}

Ответы [ 2 ]

0 голосов
/ 24 июня 2013

Вы можете использовать CollectionJoin для решения этой проблемы. Проверьте Пример CollectionJoin в критериях JPA

0 голосов
/ 08 октября 2010

Возьмем этот пример, у которого есть классы Ферма и Животное (у Фермы есть коллекция ), и мы хотим наложить критерий на имя Животного. Не совсем так, как вы, я думаю, но может направить вас в правильном направлении

CriteriaBuilder qb = emf.getCriteriaBuilder();
CriteriaQuery<Farm> crit = qb.createQuery(Farm.class);
Root<Farm> candidate = crit.from(Farm.class);
candidate.alias("f");
crit.select(candidate);

Metamodel model = emf.getMetamodel();
ManagedType farmType = model.managedType(Farm.class);
Attribute animalAttr = farmType.getAttribute("animals");
Join animalJoin = candidate.join((ListAttribute)animalAttr);
animalJoin.alias("a");

Path nameField = animalJoin.get("name");
Predicate nameEquals = qb.equal(nameField, "Woolly Sheep");
crit.where(nameEquals);

Приравнивается к SELECT f FROM org.jpox.samples.annotations.one_many.bidir.Farm f JOIN f.animals a WHERE (a.name = 'Woolly Sheep')

НТН

...