“进入” /“不进入”的Gorm标准

时间:2019-08-26 19:39:11

标签: grails groovy gorm criteria

我必须编写一些查询才能在复杂的数据模型中实现搜索。我想使用Gorm的Criteria DSL来解决这个问题。 对于简单的查询,例如GormGrails 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)
                       }
                   }      
                }

我的错误在哪里?我可以使用子查询吗?

2 个答案:

答案 0 :(得分:0)

我认为应该是tt.id,您的迭代位于“标题类型”列表上,并且您要为具有ID的TitleType进行补偿。

答案 1 :(得分:0)

针对您的全能,请尝试以下操作:

query = query.build {
               titles {
                   titletype {
                     argsTitletype.each { tt ->                        
                           eq 'id', tt
                     }
                   }      
                }
              }

您不需要and,因为默认情况下会应用它们。