带有别名的 GORM notIn 子查询

GORM notIn subquery with alias

我正在尝试在 GORM 中实现以下 SQL 查询:

select au.* from App_user au
inner join SEC_USER su on su.id=au.SEC_USER_ID
where 
not su.id in (
    select susr.SEC_USER_ID from SEC_USER_SEC_ROLE susr
        inner join SEC_ROLE sr on susr.SEC_ROLE_ID=sr.id
    where sr.authority like 'ROLE_INTERNAL%'
    and susr.SEC_USER_ID=su.id
)

(获取所有没有匹配 ROLE_INTERNAL.* 模式的角色的用户)

我有一个有效的查询,使用 GORM:

        AppUser.createCriteria().list(args, {
            secUser {
//                def su = SecUser
                notIn "id", SecUserSecRole.where {
                    secRole {
                        authority ==~ 'ROLE_INTERNAL%'
                    }
/*
                    secUser {
                        id == su.id
                    }
*/
                }.property("secUser.id")
            }
        })

但是这个查询效率很低,因为我不知道如何在条件 DSL 中添加 SQL where 子句 and susr.SEC_USER_ID=su.id

我在这里和那里看到提到使用注释代码,在根级别创建 SecUser (su) 的别名,然后在子查询中使用它,但我在尝试时遇到以下异常取消注释我的附加语句:

No such property: id for class: SecUser

感觉自己真的很接近了,但是看文档还是想不通。这方面比较稀疏

正如 documentation 在“7.4.8. GORM 中的更多高级子查询”下显示的那样,

DetachedCriteria<AppUser> query = AppUser.where {
    secUser {
        def u = SecUser
        notIn "id", SecUserSecRole.where {
            def u2 = secUser
            secRole.authority ==~ 'ROLE_INTERNAL%' && u2.id == u.id
        }.property("secUser.id")
    }
}
query.list(args)