在CriteriaQuery中正确编写JOIN

时间:2014-01-30 08:43:33

标签: java jpa join jpql

我有三种数据模型: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>

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

2 个答案:

答案 0 :(得分:1)

Join<Profile, Group> joinGroup = root.join("user", JoinType.LEFT)
    .join("groups", JoinType.LEFT);

答案 1 :(得分:1)

最好在创建条件中使用别名,例如

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?

相关问题