2010-10-08 44 views
0

J'ai un CriteriaBuilder et j'essaie de créer un prédicat pour limiter les résultats dans un CollectionAttribute. Je voudrais dire quelque chose comme obtenir toutes les entités de cette collection où l'attribut A de l'entité est égal à x. Par exemple, j'ai beaucoup d'entités People. Ils ont une collection de titres d'emplois (anciens et actuels) et j'aimerais connaître toutes les personnes qui ont eu un titre de «banquier». Voici un exemple:Test CollectionAttribute dans 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(); 
... 

Toute aide serait géniale. Je me bats pour trouver beaucoup sur CollectionAttribute et de les utiliser dans les prédicats ... et je continue à obtenir nulls quand j'utilise la jointure ci-dessous dans le prédicat :-(Merci

Ceci est mon code actuel:

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(); 
... 

d'autres classes (je peux ajouter plus si nécessaire):

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

Répondre

0

Prenez cet exemple qui a des classes de ferme et des animaux (Ferme a une collection <animale>) et nous voulons imposer un critère sur le nom de l'animal, pas exactement le même que le vôtre, je pense, mais il peut vous orienter dans la bonne direction

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

correspond à SELECT f FROM org.jpox.samples.annotations.one_many.bidir.Farm f JOIN f.animals a WHERE (a.name = 'Woolly Sheep')

HTH

+0

merci, mais en utilisant la jointure dans le prédicat me donne un NullPointerExcetion. Je n'ai pas besoin de la jointure explicite, ce qui indique que la jointure est faite avec empressement. Je pense que cela pourrait causer un problème où dès qu'une entité est jointe, les attributs dans cette entité sont joints, d'où les nulls ?! je suis un peu coincé ... –