2010-10-08 47 views
0

我有一個CriteriaBuilder,並試圖創建一個謂詞來限制CollectionAttribute中的結果。我想說一些類似於獲取此集合中實體的屬性A等於x的所有實體。例如,我有很多People實體。他們有一系列職位(以前和現在),我想知道所有擁有「銀行家」頭銜的人。這裏是一個例子:CollectionAttribute在JPA CriteriaBuilder中的測試

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

回答

0

拿這個例子有農場和動物(農場具有收藏<動物>)的類,我們要強加的名稱的標準動物,不完全一樣因爲你,我認爲,但可能你指出正確的方向

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

+0

謝謝,但在謂詞中使用連接給了我一個NullPointerExcetion。我不需要顯式連接,這表明加入是急切地完成的。我認爲這可能會導致一個問題,只要一個實體加入,該實體內的屬性就會加入,因此空值?!我有點卡住了... – 2010-10-08 17:12:55