【问题标题】:jpa criteria for many to many relationship多对多关系的jpa标准
【发布时间】: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 时我被卡住了,因为我没有要给出的答案列表加入。

【问题讨论】:

    标签: java hibernate many-to-many jpa-2.0 criteria


    【解决方案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%"));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-07
          • 1970-01-01
          • 2018-09-06
          • 2013-04-25
          相关资源
          最近更新 更多