导出模型属性的DetachedCriteria默认查询



我是grails/gorm的新手,我正在为我的前端调用构建和API。我正在使用DetachedCriteria进行查询和筛选,我发现我复制了太多代码。。。

对于模型的每个类,我必须编写DetachedCriteria来创建每个属性的"eq"one_answers"likes"(如果我想实现neq、gt、lt等,我也必须这样做(。

我的问题是,有什么方法可以使它对任何模型类都是可重用的吗?

型号

class Model{ 
String id
String code
String name
String url
...

服务

interface IModelService {
Model get(Serializable id)
void delete(Serializable id)
Model save(Model model)
}

@Service(Model)
abstract class ModelService implements IModelService{
private DetachedCriteria buildCriteria(Map params) {
new DetachedCriteria(Model).build {
if(params.q) {
or{
ilike('name', "%${params.q}%")
ilike('code', "%${params.q}%")
ilike('url', "%${params.q}%")
}
}
if(params.code) {
eq('code', params.code)
}
if(params.name) {
eq('name', params.name)
}
if(params.url) {
eq('url', params.url)
}
}
}
List<Model> search(Map params) {
buildCriteria(params).list(params) as List<Model>
}
...

我通过创建外部抽象类解决了这个问题

型号

@Service(Model)
abstract class ModelService extends DetachedCriteriaService implements IModelService {
@Override
Class getClazz(){
Model
}
protected DetachedCriteria buildCriteria(Map params) {
super.buildCriteria(params).build {}
}
...

外部类

import grails.gorm.DetachedCriteria
abstract class DetachedCriteriaService<T> {
protected DetachedCriteria buildCriteria(Map params) {
new DetachedCriteria(getClazz()).build {
if(params.q) {
or {
getQSearchFields().each {
ilike(it, "%${params.q}%")
}
}
}
getFields().intersect(params.keySet()).each {
List<String> parts = it.split(':')*.trim()
String element = parts[0]
String filter = parts[1] ?: "eq"
switch (filter) { //TODO Implementar inList
case "eq":
eq element, params[element]
break
case "ne":
ne element, params[element]
break
case "gt":
gt element, params[element]
break
case "lt":
lt element, params[element]
break
case "ge":
ge element, params[element]
break
case "le":
le element, params[element]
break
case "like":
like element, params[element]
break
case "ilike":
ilike element, params[element]
break
default:
eq element, params[element]
}
}
}
}
abstract Class getClazz()

相关内容

  • 没有找到相关文章

最新更新