JPA CriteriaBuilder中的CollectionAttribute测试

JPA CriteriaBuilder中的CollectionAttribute测试,jpa,eclipselink,metamodel,Jpa,Eclipselink,Metamodel,我有一个CriteriaBuilder,正在尝试创建一个谓词来限制CollectionAttribute中的结果。我想说一些类似于获取集合中的所有实体,其中实体的属性A等于x。例如,我有很多人和实体。他们有一系列的头衔(以前的和现在的),我想知道所有有“银行家”头衔的人。以下是一个例子: CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery<Object> query = builder.createQuer

我有一个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();
...
CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery=builder.createQuery();
Root=query.from(MheAreaLocation.class);
谓词p2=builder.equal(root.get(Jobs_u.Jobs).get(Jobs_u.titles),“banker”);
TypedQuery q=em.createQuery(查询);
List 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();
...
CriteriaBuilder=em.getCriteriaBuilder();
//CriteriaQuery=builder.createQuery();
CriteriaQuery=builder.createQuery();
Root mheAreaLocationRoot=query.from(MheAreaLocation.class);
CollectionJoin-join=mheAreaLocationRoot.join(MheAreaLocation\uu0.childLocation).join(MheLocation\u0.atlasLocationGroupMapCollection);
//.join(AtlasLocationGroupMap.atlasLocationGroup,JoinType.INNER);
谓词p1=builder.equal(mHeareLocationRoot.get(mHeareLocation_u2;.parentLocation).get(mHeareLocation_2;.mHearocid),“AZP1B”);
//谓词p2=builder.equal(mHeareLocationRoot.get(mHeareLocation\uU2.childLocation).get(mHeareLocation\uU2.atlasLocationGroupMapCollection));
谓词p2=builder.equal(join.get(AtlasLocationGroupMap.atlasLocationGroup).get(atlasLocationGroup.locationGroupType),“下一站”);
//查询。其中(生成器和(e1,e2));
//mheAreaLocationRoot.fetch(MheAreaLocation.childLocation);
//join.fetch(MheLocation_uzy.atlasLocationGroupMapCollection);
//query.multiselect(mheAreaLocationRoot.get(MheAreaLocation\uu.parentLocation),
//mheAreaLocationRoot.get(MheAreaLocation_uz.childLocation));
//query.select(builder.tuple(join.get(AtlasLocationGroupMap_uuz.mheLocation));
TypedQuery q=em.createQuery(查询);
List resultList=q.getResultList();
...
其他类(如果需要,我可以添加更多):

@StaticMetamodel(MheLocation.class)
公共类MheLocation{
公共静态易失性集合属性atlasLocationGroupMapCollection;
公共静态易失性;
}

以这个例子为例,它有农场和动物类(农场有一个集合),我们想对动物的名字施加一个标准。我认为这和你的名字不完全一样,但可能会为你指明正确的方向

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);
CriteriaBuilder qb=emf.getCriteriaBuilder();
CriteriaQuery crit=qb.createQuery(Farm.class);
根候选=来自(农场类)的临界值;
候选人。别名(“f”);
临界选择(候选);
Metamodel=emf.getMetamodel();
ManagedType farmType=model.ManagedType(Farm.class);
属性animalAttr=farmType.getAttribute(“动物”);
Join animalJoin=candidate.Join((ListAttribute)animalAttr);
animalJoin.别名(“a”);
Path nameField=animalJoin.get(“name”);
谓词nameEquals=qb.equal(nameField,“羊毛羊”);
临界值,其中(名称等于);
等同于
从org.jpox.samples.annotations.one_many.bidir.Farm中选择f加入f.animals a WHERE(a.name='Woolly Sheep')


HTH

谢谢,但是在谓词中使用连接会给我一个NullPointerExcetion。我不需要显式连接,这表明连接是急切地完成的。我认为这可能会导致一个问题,即一旦连接实体,该实体中的属性就被连接,因此为Null?!我有点卡住了。。。
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);