2011-11-15 49 views
12

Tôi có 2 lớp POJO trong Java, Trả lời và Cộng tác viên, trong mối quan hệ nhiều-nhiều.tiêu chí jpa cho nhiều mối quan hệ

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

Lớp Answer có một bộ Collaborator, nhưng một Collaborator không giữ một bộ Answer. Những gì tôi cần làm từ Hibernate CriteriaQuery là tìm các cộng tác viên cho câu trả lời được đưa ra bởi id.

Tôi đã làm điều này với Hibernate Criteria (org.hibernate.Criteria) sử dụng kết quả biến áp, nhưng tôi bị mắc kẹt khi nói đến sử dụng CriteriaQuery, bởi vì tôi không có một danh sách các câu trả lời để cung cấp cho tham gia.

Trả lời

14

Thế là xong, cuối cùng ...

Dưới đây là các mã:

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

Sử dụng HQL:

Bạn có thể sử dụng này:

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

để có được tất cả các câu trả lời liên quan đến một Cộng tác viên nhất định.

Và đây:

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

Để có được tất cả các cộng tác liên quan đến một trả lời nhất định.

Sử dụng JPA2 Tiêu chuẩn API bạn có thể làm một cái gì đó như:

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 
Các vấn đề liên quan