
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?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)