具有多对多关系的实体的一些复杂条件查询

A little complex criteria query for entities with a many-to-many relation

我有 2 个实体,rolepermission。它们与多对多关系相关联。我想使用条件 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