CreateCriteria - 在 hasMany 关联中使用逻辑或
CreateCriteria - Use logical OR in hasMany association
我想要获取列表(firstsList 或 SecondsList)中包含特定用户的实例。
在我的解决方案中,创建条件仅考虑第一个用户列表。
这似乎是逻辑 OR
的错误用法
域
class ClassA {
static hasMany = [firstsList:User,SecondsList:User]
}
服务
def idList = ClassA.createCriteria().list () {
projections { distinct ( "id" )
property("name")
property("id")
}
or {
firstsList{eq("login", 'John')}
SecondsList{eq("login", 'John')}
}
order("name","desc")
}
return idList
这背后的原因是休眠默认使用 inner join
。但在您的情况下,您需要 left join
。为此,您可以使用 createAlias
of createCriteria
.
def idList = ClassA.createCriteria().list() {
projections {
distinct("id")
property("name")
}
createAlias("firstsList", "fl", JoinType.LEFT_OUTER_JOIN)
createAlias("SecondsList", "sl", JoinType.LEFT_OUTER_JOIN)
or {
eq("fl.login", "John")
eq("sl.login", "John")
}
order("name", "desc")
}
我想要获取列表(firstsList 或 SecondsList)中包含特定用户的实例。
在我的解决方案中,创建条件仅考虑第一个用户列表。
这似乎是逻辑 OR
域
class ClassA {
static hasMany = [firstsList:User,SecondsList:User]
}
服务
def idList = ClassA.createCriteria().list () {
projections { distinct ( "id" )
property("name")
property("id")
}
or {
firstsList{eq("login", 'John')}
SecondsList{eq("login", 'John')}
}
order("name","desc")
}
return idList
这背后的原因是休眠默认使用 inner join
。但在您的情况下,您需要 left join
。为此,您可以使用 createAlias
of createCriteria
.
def idList = ClassA.createCriteria().list() {
projections {
distinct("id")
property("name")
}
createAlias("firstsList", "fl", JoinType.LEFT_OUTER_JOIN)
createAlias("SecondsList", "sl", JoinType.LEFT_OUTER_JOIN)
or {
eq("fl.login", "John")
eq("sl.login", "John")
}
order("name", "desc")
}