【问题标题】:Criteria building in GORMGORM 中的标准构建
【发布时间】:2011-06-14 10:23:37
【问题描述】:
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 个操作。

【问题讨论】:

    标签: grails criteria grails-orm nhibernate-criteria


    【解决方案1】:

    你可以使用String作为Criteria操作,比如:

    A.withCriteria {
      'eq' (id, 1)
    }
    

    所以你可能会遇到类似的事情

    A.withCriteria {
        (groupOp) {
            for (???) {
                (op[i]) (fields[i], parsedVals[i])
            }
        }
    }
    

    无论如何,您都需要清理网络提交的查询,只针对允许的操作子集。你不想接收结束执行任意sqlRestriction,对吧? :D 所以代码会比这个更复杂。

    注意:将and{}or {} 包裹在单个语句周围没有意义,您需要将其包裹在整个if-s 块中。

    【讨论】:

      【解决方案2】:

      我建议你看一下FilterPane插件的源代码。它的服务基本上可以完成您正在做的事情,并且可能会为您提供一些改进的想法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-08
        • 1970-01-01
        • 1970-01-01
        • 2015-10-23
        • 2019-12-31
        • 2010-12-12
        • 1970-01-01
        • 2017-12-07
        相关资源
        最近更新 更多