【问题标题】:Gorm Criteria for "each in" / "none in"“每个入”/“无入”的 Gorm 标准
【发布时间】:2019-12-31 00:04:20
【问题描述】:

我必须编写一些查询来实现在复杂数据模型中的搜索。我想使用 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()
    }

上面查询的返回有预期的结果:All Content,在argsTitletype中有一个Titletype


但是如何查询“Content, which has all the Titletypes in 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)
                       }
                   }      
                }

我的错误在哪里?我必须使用子查询吗?

【问题讨论】:

    标签: grails groovy grails-orm criteria


    【解决方案1】:

    对于您的全押,请尝试以下方法:

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

    这里不需要ands,因为它们是默认应用的。

    【讨论】:

    • 这只适用于一个titletype.id。如果我用argsTitletype = [1] 查询,我会得到所有Contenttitletype.id == 1。但是,如果我提供多个参数,例如argsTitletype = [1, 2],我会得到一个空结果。 (我知道有一个Content,其中有一个Titletypeid=1,另一个是id=2
    • 在您的配置中将dataSource.logSql 设置为true 并分析查询
    • 尝试换行titles{argsTitletype.each { tt ->
    • 我试过了。它也不起作用。我认为有必要使用子查询和“存在”。但现在我将使用 SQL。
    • 是的,那种all-in强制交集不是SQL提供的开箱即用的东西,你必须应用一些肮脏的技巧
    猜你喜欢
    • 2011-12-08
    • 1970-01-01
    • 2019-04-05
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多