2014-01-30 29 views
1

我有三种数据模型:Profile,User和UserGroup。个人资料与用户(创建此个人资料)具有@ManyToOne关系,用户拥有包含列表的@ManyToMany。 我需要获取由用户创建此配置文件的相同组的任何用户创建的配置文件。在JPQL这看起来,它似乎正常工作:在CriteriaQuery中正确写入JOIN

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?

回答

1
Join<Profile, Group> joinGroup = root.join("user", JoinType.LEFT) 
    .join("groups", JoinType.LEFT); 
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?