我必须编写一些查询才能在复杂的数据模型中实现搜索。我想使用Gorm的Criteria DSL来解决这个问题。 对于简单的查询,例如Gorm或Grails Documentation中的示例,这没问题,但我不知道如何实现更复杂的查询,例如 “每个输入”,“无输入”或“仅x之一在”。我希望有人能给我提示。
Grails域类:
class Content {
Integer contentNumber
static hasMany = [titles : Title]
}
class Title {
String title
Titletype titletype
}
class Titletype {
String name
}
具有条件的方法:
def filter(GrailsParameterMap args) {
//To ensure that the ids of titletypes to query are always given as Long[]
Long[] argsTitletype = [args.title.titletype.value].flatten() as Long[]
def query = new DetachedCriteria(Content).build {}
// Every Content, which has a Title with Titletype in argsTitletype
query = query.build {
titles {
'in'('titletype.id', argsTitletype)
}
}
return query.list()
}
上面查询的返回具有预期的结果:所有内容,在argsTitletype中具有Titletype
但是如何查询“在argsTitletype中具有全部标题类型的内容”? 我尝试了例如:
query = query.build {
titles {
and {
argsTitletype.each { tt ->
eq('titletype.id', tt)
}
}
}
或
query = query.build {
and {
argsTitletype.each { tt ->
titles {
eq('titletype.id', tt)
}
}
}
我的错误在哪里?我可以使用子查询吗?
答案 0 :(得分:0)
我认为应该是tt.id
,您的迭代位于“标题类型”列表上,并且您要为具有ID的TitleType进行补偿。
答案 1 :(得分:0)
针对您的全能,请尝试以下操作:
query = query.build {
titles {
titletype {
argsTitletype.each { tt ->
eq 'id', tt
}
}
}
}
您不需要and
,因为默认情况下会应用它们。