2011-11-15 16 views
12

Tengo 2 clases de POJO en Java, Answer y Collaborator, en una relación de muchos a muchos.jpa criterios para la relación de muchos a muchos

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

Clase Answer tiene un conjunto de Collaborator, sino una Collaborator no mantiene un conjunto de Answer. Lo que tengo que hacer desde Hibernate CriteriaQuery es encontrar a los colaboradores para una respuesta dada por id.

ya he hecho esto con Hibernate Criteria (org.hibernate.Criteria) utilizando transformador resultado, pero estoy atascado cuando se trata de usar CriteriaQuery, porque no tengo una lista de respuestas para dar a la unión.

Respuesta

14

Está hecho, finalmente ...

Aquí está el código:

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

Usando HQL:

Se puede utilizar esta:

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

a obtener todas las respuestas asociadas a un determinado colaborador.

Y esto:

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

Para obtener todos los colaboradores asociados a una determinada respuesta.

Usando la API JPA2 criterios que puede hacer algo como:

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 
Cuestiones relacionadas