if (params.filters) {
def o = JSON.parse(params.filters);
def groupOp = o.groupOp
def fields = o.rules.field
def values = o.rules.data
def op = o.rules.op
println fields
println values
if(groupOp == "AND") {
fields.eachWithIndex {a, i ->
println op[i]
if(op[i].equals( "eq")) {
and{ eq(fields[i], values[i])}
}
if(op[i].equals("ne")) {
and{ ne(fields[i], values[i])}
}
if(op[i].equals("ge")) {
def valu = Double.valueOf( values[i]);
and{ ge(fields[i], valu)}
}
}
}
if(groupOp == "OR") {
fields.eachWithIndex {a, i ->
println op[i]
if(op[i].equals( "eq")) {
println 'eq';
or{ eq(fields[i], values[i])}
}
if(op[i].equals("ne")) {
println 'ne';
or{ ne(fields[i], values[i])}
}
if(op[i].equals("ge")) {
def valu = Double.valueOf( values[i]);
or{ ge(fields[i], valu)}
}
}
}
}
其中params.filters
遵循JSON文本。
{
"groupOp":"OR",
"rules":[
{
"field":"foo1",
"op":"le",
"data":"9.5"
},
{
"field":"foo2",
"op":"eq",
"data":"12345-123"
},
{
"field":"foo3",
"op":"cn",
"data":"IDM"
}
]
}
此数据来自JQuery数据网格。
有更好的方法吗? 在代码中,我刚刚列出了3个运算符,但实际上我有14个运算。
答案 0 :(得分:2)
您可以使用String作为Criteria操作,例如:
A.withCriteria {
'eq' (id, 1)
}
所以你可能会遇到像
这样的事情A.withCriteria {
(groupOp) {
for (???) {
(op[i]) (fields[i], parsedVals[i])
}
}
}
无论如何,您只需要对允许的操作子集清理Web提交的查询。您不希望收到任意结束任意sqlRestriction
,对吗? :D所以代码会比这更复杂。
注意:围绕单个语句包装and{}
或or {}
没有意义,你需要把它放在if
- s的整个块中。
答案 1 :(得分:1)
我建议您查看FilterPane插件的源代码。它的服务基本上与你正在做的事情有关,可能会给你一些改进的想法。