在Grails条件中的一组列之间使用OR运算符
我有一个使用groovy代码中的Grails条件查询数据库的代码。 以下只是将where子句/条件添加到标准中的测试代码的一部分在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",
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)
}
}