2011-11-15 4 views
12

J'ai deux classes POJO en Java, Answer et Collaborator, dans une relation many-to-many.jpa critères pour plusieurs à plusieurs relations

class Answer { 
    @ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "ANSWERS_COLLABORATORS", joinColumns = { @JoinColumn(name = "aid") }, inverseJoinColumns = { @JoinColumn(name = "cid") }) 
    private Set<Collaborator> collaborators = new HashSet<Collaborator>(0); 
} 

classe Answer a un ensemble de Collaborator, mais Collaborator ne tient pas un ensemble de Answer. Ce que je dois faire à partir de Hibernate CriteriaQuery est de trouver les collaborateurs pour une réponse donnée par id.

Je l'ai déjà fait avec Hibernate Criteria (org.hibernate.Criteria) en utilisant un transformateur de résultat, mais je suis coincé quand il s'agit d'utiliser CriteriaQuery, parce que je n'ai pas une liste de réponses à donner à la jointure.

Répondre

14

Il est fait, enfin ...

Voici le code:

public List<Collaborator> getCollaborators(Long answerId) { 
     CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 
     CriteriaQuery<Collaborator> criteriaQuery = criteriaBuilder 
       .createQuery(Collaborator.class); 
     Root<Answer> answerRoot = criteriaQuery.from(Answer.class); 
     criteriaQuery.where(criteriaBuilder.equal(answerRoot.get(Answer_.id), 
       answerId)); 
     SetJoin<Answer, Collaborator> answers = answerRoot 
       .join(Answer_.collaborators); 
     CriteriaQuery<Collaborator> cq = criteriaQuery.select(answers); 
     TypedQuery<Collaborator> query = entityManager.createQuery(cq); 
     return query.getResultList(); 

    } 
8

En utilisant HQL:

Vous pouvez utiliser ceci:

Criteria criteria = session.createCriteria(Answer.class); 
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
criteria.createAlias("collaborators", "collaborators"); 
criteria.add(Restrictions.eq("collaborators.id",desiredCollaboratorId); 

pour obtenir toutes les réponses associées à un certain Collaborator.

Et ceci:

Criteria criteria = session.createCriteria(Answer.class); 
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
criteria.setFetchMode("collaborators", FetchMode.JOIN) 
criteria.add(Restrictions.idEq(desiredAnswerId)); 
dsrTrackingCriteria.setProjection(Projections.property("collaborators")); 

Pour obtenir tous les collaborateurs associés à une certaine réponse.

Utilisation de l'API de critères de JPA2 vous pouvez faire quelque chose comme:

CriteriaBuilder cb = em.getCriteriaBuilder(); //creted from EntityManager instance 

CriteriaQuery<Long> cq = cb.createQuery(Collaborator.class); 
Root<Answer> rootAnswer = cq.from(Answer.class); 
Join<Collaborator,Answer> joinAnswerCollaborator = rootAnswer.join("collaborators"); //(or rootAnswer.join(Answer_.collaborators); if you've created the metamodel with JPA2 
Questions connexes