【问题标题】:Writing JOIN correctly in CriteriaQuery在 CriteriaQuery 中正确编写 JOIN
【发布时间】:2014-02-22 11:03:37
【问题描述】:

我有三个数据模型:Profile、User 和 UserGroup。配置文件与用户(创建此配置文件)具有@ManyToOne 关系,用户与列表具有@ManyToMany 关系。 我需要获取由用户创建此配置文件所属的同一组的任何用户创建的配置文件。在 JPQL 中它看起来像这样,并且似乎工作正常:

SELECT p FROM Profile p
LEFT JOIN p.user u
LEFT JOIN u.groups g
WHERE g.id in :groups

我需要做的是通过 CriteriaQuery 实现相同的功能。

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Profile> criteria = builder.createQuery(Profile.class);
Root<Profile> root = criteria.from(Profile.class);
Join<Profile, Group> joinGroup = root.join("user").join("groups");

criteria.select(root).where(joinGroup.in(groups))
// groups is a method parameter with a type of List<Group>

在这种情况下如何编写正确的Join?

【问题讨论】:

    标签: java jpa join jpql


    【解决方案1】:
    Join<Profile, Group> joinGroup = root.join("user", JoinType.LEFT)
        .join("groups", JoinType.LEFT);
    

    【讨论】:

      【解决方案2】:

      最好在创建条件时使用别名

      Criteria plan= dbSession.createCriteria(Profile.class,"<aliasname>")                                            .createAlias("<aliasname>.<columnName>", "<aliasname1>")
      .createAlias("<aliasname1>.<columnName>", "<aliasname2>")                                           .add(Restrictions.eq("<aliasname2>.cloumn", groups object));
      

      供参考-hibernate - createCriteria or createAlias?

      【讨论】:

        猜你喜欢
        • 2022-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-02
        相关资源
        最近更新 更多