Groovy   发布时间:2022-04-12  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了动态地以干燥的方式在Grails中构建createCriteria?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在努力动态构建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':
                @R_721_8616@("${rule['field']}","${rule['value']}%")
                break
            case 'bn':
                not{@R_721_8616@("${rule['field']}","${rule['value']}%")}
                break
            case 'ew':
                @R_721_8616@("${rule['field']}","%${rule['value']}")
                break
            case 'en':
                not{@R_721_8616@("${rule['field']}","%${rule['value']}")}
                break
            case 'cn':
                @R_721_8616@("${rule['field']}","%${rule['value']}%")
                break
            case 'nc':
                not{@R_721_8616@("${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?所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。