如何动态修改groovy hibernate查询

如何动态修改groovy hibernate查询,hibernate,grails,groovy,Hibernate,Grails,Groovy,我正在尝试向查询添加一些用户定义的过滤器。过滤器是html列表元素中的属性,我要做的是,如果未选择“all”,则将条件添加到查询中。到目前为止我试过的是 Criteria crit = Person.createCriteria(). addAccountCondition(crit) addPrimarySkillCondition(crit) addSkillsetCondition(crit) addDateCondition(crit) crit.addOrder(Order.asc("

我正在尝试向查询添加一些用户定义的过滤器。过滤器是html列表元素中的属性,我要做的是,如果未选择“all”,则将条件添加到查询中。到目前为止我试过的是

Criteria crit = Person.createCriteria().
addAccountCondition(crit)
addPrimarySkillCondition(crit)
addSkillsetCondition(crit)
addDateCondition(crit)
crit.addOrder(Order.asc("account.name"))

crit.list()

private void addAccountCondition(Criteria query){
String acct = params?.accts?.value?.toString()

if (!acct.equals("all") && acct != null){
    query.add(Restrictions.eq("account.name", acct))
// old version
    //          query = query.where {
//              account {
//                  eq "name", acct
//                  order "name", "asc"
//              }
//          }
    println "acct is ${acct}"
    println "Applying account condition. The query is ${query.toString()}"
}
}

但是,通过这段代码,我试图将groovy标准转换为Hibernate标准。我知道如何使用所有这些进行groovy查询,但不知道如何动态地进行查询。从您的代码示例中,有点难判断到底发生了什么,但类似的内容可能会有所帮助

def results = Person.withCriteria {
    def acct = params.accts?.value
    if(acct) {
        account {
            eq 'name', acct
        }
    }
}
如果您真的想将闭包传递给几个方法,如addPrimarySkillCondition、addDateCondition等,可以通过对闭包进行一些特殊的委托处理来实现。为了向您展示细节,我需要了解这些方法中的内容

我希望这能有所帮助。

看看这里——所有带有domainclasses搜索值等的动态查询都是从别处传入的