许多关系的jpa标准

我在Java,Answer和Collaborator中有2个POJO类,处于多对多关系中。

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

Class Answer有一套Collaborator ,但Collaborator没有一套Answer 。 我需要从Hibernate CriteriaQuery做的是找到id给出的答案的协作者。

我已经使用结果转换器使用Hibernate Criteriaorg.hibernate.Criteria )完成了这项工作,但是在使用CriteriaQuery时我遇到了CriteriaQuery ,因为我没有给出连接的答案列表。

它完成了,最后……

这是代码:

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

使用HQL:

你可以用这个:

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

获取与某个协作者关联的所有答案。

和这个:

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

让所有协作者与某个答案相关联。

使用JPA2 Criteria API,您可以执行以下操作:

 CriteriaBuilder cb = em.getCriteriaBuilder(); //creted from EntityManager instance CriteriaQuery cq = cb.createQuery(Collaborator.class); Root rootAnswer = cq.from(Answer.class); Join joinAnswerCollaborator = rootAnswer.join("collaborators"); //(or rootAnswer.join(Answer_.collaborators); if you've created the metamodel with JPA2