Reputation: 5256
I have 2 POJO classes in Java, Answer and Collaborator, in a many-to-many relationship.
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);
}
Class Answer
has a set of Collaborator
, but a Collaborator
doesn't keep a set of Answer
.
What I need to do from Hibernate CriteriaQuery
is to find the collaborators for an answer given by id.
I have already done this with Hibernate Criteria
(org.hibernate.Criteria
) using result transformer, but I'm stuck when it comes to using CriteriaQuery
, because I don't have a list of answers to give to the join.
Upvotes: 27
Views: 35171
Reputation: 21
Join<Answer , Collaborator> join = root.join("collaborators",JoinType.INNER);
predicates.add(criteriaBuilder.equal(join.get("id"),id));
Upvotes: 2
Reputation: 623
Using criteria Builder :
Join<CLASS_A, CLASS_B> join = root.join(WHAT_UVE_DECLARED_IN_MAPPEDBY, JoinType.INNER);
searchCriteria.add(criteriaBuilder.like(join.get("FIELD_IN_SUBCLASS").as(String.class), "%blabla%"));
Upvotes: 1
Reputation: 5256
It's done, finally...
Here's the code:
public List<Collaborator> getCollaborators(Long answerId) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Collaborator> criteriaQuery = cb.createQuery(Collaborator.class);
Root<Answer> answerRoot = criteriaQuery.from(Answer.class);
SetJoin<Answer, Collaborator> answers = answerRoot.join(Answer_.collaborators);
criteriaQuery.where(cb.equal(answerRoot.get(Answer_.id), answerId));
return entityManager
.createQuery(criteriaQuery.select(answers))
.getResultList();
}
Upvotes: 32
Reputation: 15219
Using HQL:
You can use this:
Criteria criteria = session.createCriteria(Answer.class);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.createAlias("collaborators", "collaborators");
criteria.add(Restrictions.eq("collaborators.id",desiredCollaboratorId);
to get all the Answers associated to a certain Collaborator.
And this:
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"));
To get all Collaborators associated to a certain Answer.
Using JPA2 Criteria API you can do something like:
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
Upvotes: 9