具有多对多关系的实体的一些复杂条件查询
A little complex criteria query for entities with a many-to-many relation
我有 2 个实体,role
和 permission
。它们与多对多关系相关联。我想使用条件 API 查找所有 未 分配给特定角色的权限。权限可以分配给其他角色或根本不分配。
我想到的是:
Specification<Permission> specification = (permission, query, cb) -> cb.not(permission.join(Permission_.roles).get(Role_.id).in(roleId));
specification = specification.or((permission, query, cb) -> cb.isEmpty(permission.get(Permission_.roles)));
这会生成以下查询(将所有列替换为 *):
select permission0_.*
from permission permission0_
inner join role2permission roles1_ on permission0_.id=roles1_.permission_id
inner join role role2_ on roles1_.role_id=role2_.id
where role2_.id not in (?) or not (exists (select role4_.id
from role2permission roles3_, role role4_
where permission0_.id=roles3_.permission_id
and roles3_.role_id=role4_.id))
但它不能正常工作。有什么我错过的吗?
尝试以下方法
Specification<Permission> specification = (permission, query, cb) -> cb.isMember(role, permission.get(Permission_.roles)).not();
specification = specification.or((permission, query, cb) -> cb.isEmpty(permission.get(Permission_.roles)));
使用 Role 对象而不是 roleId
我有 2 个实体,role
和 permission
。它们与多对多关系相关联。我想使用条件 API 查找所有 未 分配给特定角色的权限。权限可以分配给其他角色或根本不分配。
我想到的是:
Specification<Permission> specification = (permission, query, cb) -> cb.not(permission.join(Permission_.roles).get(Role_.id).in(roleId));
specification = specification.or((permission, query, cb) -> cb.isEmpty(permission.get(Permission_.roles)));
这会生成以下查询(将所有列替换为 *):
select permission0_.*
from permission permission0_
inner join role2permission roles1_ on permission0_.id=roles1_.permission_id
inner join role role2_ on roles1_.role_id=role2_.id
where role2_.id not in (?) or not (exists (select role4_.id
from role2permission roles3_, role role4_
where permission0_.id=roles3_.permission_id
and roles3_.role_id=role4_.id))
但它不能正常工作。有什么我错过的吗?
尝试以下方法
Specification<Permission> specification = (permission, query, cb) -> cb.isMember(role, permission.get(Permission_.roles)).not();
specification = specification.or((permission, query, cb) -> cb.isEmpty(permission.get(Permission_.roles)));
使用 Role 对象而不是 roleId