0

CriteriaBuilder があり、CollectionAttribute で結果を制限する述語を作成しようとしています。エンティティの属性 A が x に等しいこのコレクション内のすべてのエンティティを取得するようなことを言いたいと思います。たとえば、People エンティティがたくさんあります。彼らは役職 (以前と現在) のコレクションを持っています。私は「銀行家」の役職を持っていたすべての人について知りたいです。次に例を示します。

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 とそれらを述語で使用することについて多くを見つけるのに苦労しています...そして、述語で以下の結合を使用するとnullを取得し続けます:-(ありがとう

これは私の実際のコードです:

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;
}
4

1 に答える 1

0

Farm と Animal のクラスを持つこの例 (Farm にはコレクション <Animal> があります) を見て、Animal の名前に基準を課したいと考えています。あなたとまったく同じではないと思いますが、正しい方向に向けるかもしれません

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')

HTH

于 2010-10-08T16:47:29.643 に答える