use*_*692 17 java many-to-many hibernate criteria jpa-2.0
我在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<Collaborator> collaborators = new HashSet<Collaborator>(0);
}
Run Code Online (Sandbox Code Playgroud)
类Answer有一套Collaborator,但是Collaborator不保留一套Answer.我需要从Hibernate做的CriteriaQuery是找到id给出的答案的协作者.
我已经使用结果转换器在Hibernate Criteria(org.hibernate.Criteria)中完成了这个,但是在使用时我遇到了困难CriteriaQuery,因为我没有给出连接的答案列表.
use*_*692 23
它完成了,最后......
这是代码:
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();
}
Run Code Online (Sandbox Code Playgroud)
使用HQL:
你可以用这个:
Criteria criteria = session.createCriteria(Answer.class);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.createAlias("collaborators", "collaborators");
criteria.add(Restrictions.eq("collaborators.id",desiredCollaboratorId);
Run Code Online (Sandbox Code Playgroud)
获取与某个协作者关联的所有答案.
还有这个:
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"));
Run Code Online (Sandbox Code Playgroud)
让所有协作者与某个答案相关联.
使用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22027 次 |
| 最近记录: |