【发布时间】:2014-04-02 13:36:38
【问题描述】:
我已经搜索了一段时间,我没有找到任何对我的问题的回应。
我正在 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 子句,因此我无法在查询中更改我的 to 连接,因为实体不存在:表 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,这是一个英语论坛。我试图翻译你的问题。以后,请用英文发布您的问题和答案。
-
非常感谢翻译!
标签: jpa glassfish eclipselink criteria builder