多对多关系的jpa标准
Posted
技术标签:
【中文标题】多对多关系的jpa标准【英文标题】:jpa criteria for many to many relationship 【发布时间】:2011-12-29 10:53:49 【问题描述】:我在 Java 中有 2 个 POJO 类,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
,但Collaborator
没有一组Answer
。
我需要从 Hibernate CriteriaQuery
做的是为 id 给出的答案找到合作者。
我已经使用结果转换器对 Hibernate Criteria
(org.hibernate.Criteria
) 完成了此操作,但是在使用 CriteriaQuery
时我被卡住了,因为我没有要给出的答案列表加入。
【问题讨论】:
【参考方案1】:使用 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<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
【讨论】:
【参考方案2】:终于搞定了……
代码如下:
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();
【讨论】:
【参考方案3】:使用标准生成器:
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%"));
【讨论】:
以上是关于多对多关系的jpa标准的主要内容,如果未能解决你的问题,请参考以下文章