在GORM中建立标准

|
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个运算符。     
已邀请:
        您可以将String用作Criteria操作,例如:
A.withCriteria {
  \'eq\' (id, 1)
}
所以你可能会喜欢
A.withCriteria {
    (groupOp) {
        for (???) {
            (op[i]) (fields[i], parsedVals[i])
        }
    }
}
无论如何,您只需要清理仅允许的一部分操作的Web提交查询。您不想接收结束执行任意
sqlRestriction
,对吗? :D因此,无论如何,代码将变得更加复杂。 注意:将
and{}
or {}
环绕在单个语句中没有意义,您需要将其放在整个
if
-s块中。     
        我建议您看一下FilterPane插件的源代码。它的服务本质上可以完成您正在做的事情,并且可能会给您一些增强的想法。     

要回复问题请先登录注册