Jpa критерии для многих-многих отношений
У меня есть 2 класса POJO в Java, Answer и Collaborator, в отношении многих ко многим.
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);
}
Класс Answer
имеет набор Collaborator
, но a Collaborator
не сохраняет набор Answer
.
Что мне нужно сделать из Hibernate CriteriaQuery
- это найти соавторов для ответа, заданного id.
Я уже делал это с помощью Hibernate Criteria
(org.hibernate.Criteria
) с использованием трансформатора результатов, но я застрял, когда дело дошло до использования CriteriaQuery
, потому что у меня нет списка ответов, чтобы дать присоединиться.
Ответы
Ответ 1
Сделано, наконец...
Здесь код:
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();
}
Ответ 2
Использование HQL:
Вы можете использовать это:
Criteria criteria = session.createCriteria(Answer.class);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.createAlias("collaborators", "collaborators");
criteria.add(Restrictions.eq("collaborators.id",desiredCollaboratorId);
чтобы получить все ответы, связанные с определенным Collaborator.
И это:
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"));
Чтобы получить все соавторы, связанные с определенным ответом.
Используя API критериев JPA2, вы можете сделать что-то вроде:
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