动态地以干燥的方式在Grails中构建createCriteria?

动态地以干燥的方式在Grails中构建createCriteria?,第1张

概述我正在努力动态构建createCriteria.到现在为止还挺好: obj是我想要的域对象 rulesList是一个映射列表,用于保存要搜索的字段,要使用的运算符以及要搜索的值 def c = obj.createCriteria()l = c.list (max: irows, offset: offset) { switch(obj){ //constrain r 我正在努力动态构建createCriteria.到现在为止还挺好:

obj是我想要的域对象
rulesList是一个映射列表,用于保存要搜索的字段,要使用的运算符以及要搜索的值

def c = obj.createCriteria()l = c.List (max: irows,offset: offset) {    switch(obj){           //constrain results to those relevant to the user        case Vehicle:            eq("garage",usersGarage)            break        case Garage:            users {                IDEq(user.ID)            }            break    }    rulesList.each { rule ->        switch(rule['op']){            case 'eq':                eq("${rule['fIEld']}",rule['value'])                break            case 'ne':                ne("${rule['fIEld']}",rule['value'])                break            case 'gt':                gt("${rule['fIEld']}",rule['value'])                break;            case 'ge':                ge("${rule['fIEld']}",rule['value'])                break            case 'lt':                lt("${rule['fIEld']}",rule['value'])                break            case 'le':                le("${rule['fIEld']}",rule['value'])                break            case 'bw':                ilike("${rule['fIEld']}","${rule['value']}%")                break            case 'bn':                not{ilike("${rule['fIEld']}","${rule['value']}%")}                break            case 'ew':                ilike("${rule['fIEld']}","%${rule['value']}")                break            case 'en':                not{ilike("${rule['fIEld']}","%${rule['value']}")}                break            case 'cn':                ilike("${rule['fIEld']}","%${rule['value']}%")                break            case 'nc':                not{ilike("${rule['fIEld']}","%${rule['value']}%")}                break            }        }    }}

上面的代码工作正常,只是看起来有点冗长的switch语句.但是,如果我想添加选择匹配任何规则或所有规则的功能,该怎么办?我需要有条件地将规则放在或}中.我做不了类似的事情

if(groupOp == 'or'){    or{}

在我通过rulesList然后

if(groupOp == 'or'){    }}

之后.我能想到的就是为每个条件重复代码:

if(groupOp == 'or'){    or{        rulesList.each { rule ->            switch(rule['op']){                ...            }        }    }}else{    rulesList.each { rule ->        switch(rule['op']){            ...        }    }

现在代码看起来很草率和重复.假设我想搜索域对象属性的属性? (例如:我想要归还轮胎属于特定品牌的车辆; vehicle.tires.brand,或者司机与名称匹配的车辆; vehicle.driver.name).我是否必须做以下事情:

switch(rule['op']){    case 'eq':        switch(thePropertIEsProperty){            case Garage:                garage{                    eq("${rule['fIEld']}",rule['value'])                }                break            case Driver:                driver{                     eq("${rule['fIEld']}",rule['value'])                }                break        }        break    case 'ne':        ...}
解决方法 首先,您可以使用GString作为方法名称来简化您的大开关:

case ~/^(?:eq|ne|gt|ge|lt|le)$/:  "${rule['op']}"("${rule['fIEld']}",rule['value'])  break

同样的技巧适用于和/或:

"${(groupOp == 'or') ? 'or' : 'and'}"() {  rulesList.each { rule ->    switch(rule['op']){        ...    }  }}

或者您可以先将闭包赋值给变量,然后根据需要调用or(theClosure)或(theClosure).最后,对于“属性”搜索,如果添加

createalias('driver','drv')createalias('garage','grg')

在条件闭包的顶部,您可以查询诸如eq(‘drv.name’,’Fred’)之类的内容,而无需添加介入的驱动程序{…}或车库{…}节点.

总结

以上是内存溢出为你收集整理的动态地以干燥的方式在Grails中构建createCriteria?全部内容,希望文章能够帮你解决动态地以干燥的方式在Grails中构建createCriteria?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1234722.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存