许多关系的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 Criteria
( org.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