在Grails标准中的列组之间使用OR运算符

时间:2017-11-19 14:57:31

标签: 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", city)
}

我希望生成的WHERE子句看起来像,

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

但我的代码总是以格式

生成WHERE子句
WHERE ( user.name = ? and user.city = ?) 
    AND ( user.name = ? and user.city = ?)
    AND ( user.name = ? and user.city = ?)
    .......

基本上我想在名称,城市列组之间使用OR而不是AND。     我尝试了像

这样的解决方案
    or {
        eq("user.name", name)
        eq("user.city", city)
    }

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

但没有任何内容会将AND替换为OR。 我怎样才能做到这一点。

修改

随着,

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 = ?)
    .......     

与我需要的完全相反。

2 个答案:

答案 0 :(得分:0)

您可以使用或{}块

对逻辑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)
    }
}

您可以在http://gorm.grails.org/latest/hibernate/manual/index.html#criteria的7.5.1节中阅读相关内容。连词和分离你会发现几个例子

当你必须处理这些场景时,我建议你启用sql loggin,如果你在这个article中使用grails 3清楚地解释它的过程,如果相反你使用grails 2检查这个{{ 3}}

答案 1 :(得分:0)

希望这将是一个解决方案。您必须明确提及and阻止。

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)
    }
}