我一直在寻找一段时间,我还没有找到任何回应我的问题。JPA标准JOIN et ON
我提出在JSF,的EclipseLink,Glassfish的应用程序中,用户可以有一个或多个组。该应用程序包含模块和权限如下:
- 模块=>权限=> utilisateur
- 模块=>权限=> GROUPE => utilisateur
我寻找条件查询(未在jqpl中)获取用户的所有模块。我构建我的SQL查询,其功能非常好这样的:
SELECT *
FROM core_module m
WHERE m.id IN (
SELECT m.id
FROM core_module m
INNER JOIN modules_permissions mp
ON mp.modules_id = m.id
INNER JOIN core_permission p
ON p.id = mp.permissions_id
INNER JOIN users_permissions up
ON p.id = up.permissions_id
INNER JOIN core_user u
ON u.id = 1
)
OR m.id IN (
SELECT m.id
FROM core_module m
INNER JOIN modules_permissions mp
ON m.id = mp.modules_id
INNER JOIN core_permission p
ON p.id = mp.permissions_id
INNER JOIN groups_permissions gp
ON gp.permissions_id = p.id
INNER JOIN core_group g
ON g.id = gp.groups_id
INNER JOIN users_groups ug
ON g.id = ug.groups_id
INNER JOIN core_user u
ON u.id = ug.users_id
WHERE u.id = 1
)
我想以某种方式转变为条件查询这个没有很大的成功。我刚开始查询的第一部分,它给了我用户可立即访问的模块。我的印象是我缺少一些条件或加入,因为我得到2个结果,当我不应该得到任何。事实上,我一直没能包括我ON
条款,所以我不能改变我对联接我的查询中,因为不存在的实体:表modules_permissions
是由我的实体@ManyToMany
创建...
这是我的第一个子查询草案:
List<Module> modules;
CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Module> query = cb.createQuery(Module.class);
Root<Module> root_module = query.from(Module.class);
Root<User> root_user = query.from(User.class);
Root<Permission> root_permission = query.from(Permission.class);
Root<Group> root_group = query.from(Group.class);
Join<Module, Permission> join_module_permission = root_module.join(Module_.permissions);
Join<Permission, User> join_permission_user = root_permission.join(Permission_.users);
query.where(cb.equal(root_user.get(User_.email), current.getEmail()));
modules = getEntityManager().createQuery(query).getResultList();
嗨Archi,这是一个讲英语的论坛。我试图翻译你的问题。今后,请以英文发布您的问题和答案。 –
非常感谢翻译! – Archi