在Grails条件中的一组列之间使用OR运算符

在Grails条件中的一组列之间使用OR运算符,grails,gorm,Grails,Gorm,我有一个使用groovy代码中的Grails条件查询数据库的代码。 以下只是将where子句/条件添加到标准中的测试代码的一部分 for (Map.Entry<String, String> entry : searchMap.entrySet()) { String name = entry.getKey(); String city = entry.getValue(); eq("user.name", name) eq("user.city",

我有一个使用groovy代码中的Grails条件查询数据库的代码。 以下只是将where子句/条件添加到标准中的测试代码的一部分

for (Map.Entry<String, String> entry : searchMap.entrySet()) {
    String name = entry.getKey();
    String city = entry.getValue();
    eq("user.name", name)
    eq("user.city", city)
}
但是我的代码总是在格式中生成
WHERE
子句

WHERE ( user.name = ? and user.city = ?) 
    AND ( user.name = ? and user.city = ?)
    AND ( user.name = ? and user.city = ?)
    .......
基本上,我希望在名称、城市列组之间使用
而不是
。 我尝试过这样的解决方案

    or {
        eq("user.name", name)
        eq("user.city", city)
    }

    or {
        and {
            eq("user.name", name)
            eq("user.city", city)
        }
    }
但是没有任何东西可以用
代替
。 我怎样才能做到这一点

编辑

有,

or {
        eq("user.name", name)
        eq("user.city", city)
    }
WHERE
子句生成为

WHERE ( user.name = ? and user.city = ?) 
    AND ( user.name = ? OR user.city = ?)
    AND ( user.name = ? OR user.city = ?)
    .......     

这与我需要的正好相反

您可以使用OR{}块将条件分组到逻辑OR中

您的代码可能如下所示:

For(Map.Entry<String, String> entry : searchMap.entrySet()) {
    String name = entry.getKey();
    String city = entry.getValue();

    or {
        eq("user.name", name)
        eq("user.city", city)
    }
}
For(Map.Entry:searchMap.entrySet()){
字符串名称=entry.getKey();
字符串city=entry.getValue();
或{
eq(“用户名”,名称)
eq(“用户城市”,城市)
}
}
您可以在第7.5.1节中阅读。连接和析取你会发现几个例子


当您必须处理这些场景时,我建议您启用sql loggin,如果您在本文中使用grails 3,请清楚地解释该过程,如果您使用的是grails 2,请检查此项,希望这将是您的解决方案。您必须明确地提到

def xx = Risk.createCriteria().list{
        or{
            and{
                eq 'isAccpeted', true
                eq 'isValid', true
            }
            and{
                eq 'investigationStarted', false
                eq 'isValid', true
            }
        }
    }
输出

where ((this_.is_accpeted=? and this_.is_valid=?) or (this_.investigation_started=? and this_.is_valid=?))
作为你的代码

or {
  and {
        eq("user.name", name)
        eq("user.city", city)
    }
  and {
        eq("user.name", name)
        eq("user.city", city)
    }
}

谢谢你的回复。如果你看一下我的问题,我已经试过按照你建议的方式使用“or”操作符了。但我没有得到预期的产出。我已经编辑了这篇文章,其中包含了我从你建议的代码中得到的输出。你能分享一下你用来构建标准的Groovy builder吗
or {
  and {
        eq("user.name", name)
        eq("user.city", city)
    }
  and {
        eq("user.name", name)
        eq("user.city", city)
    }
}