带有别名的 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)
我正在尝试在 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)