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

Grails 导出模型属性的DetachedCriteria默认查询,grails,groovy,gorm,Grails,Groovy,Gorm,我是grails/gorm的新手,我正在为我的前端调用构建API。我使用DetachedCriteria进行查询和筛选,我发现我复制了太多的代码 对于模型的每个类,我必须编写DetachedCriteria来创建每个属性的“eq”和“likes”(如果我想实现neq、gt、lt等,我也必须这样做) 我的问题是,有没有任何方法可以使它可重用于任何模型类 型号 class Model{ String id String code String name String

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

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

我的问题是,有没有任何方法可以使它可重用于任何模型类

型号

class Model{ 
    String id
    String code
    String name
    String url

...

@Service(Model)
abstract class ModelService extends DetachedCriteriaService implements IModelService {

    @Override
    Class getClazz(){
        Model
    }

    protected DetachedCriteria buildCriteria(Map params) {
        super.buildCriteria(params).build {}
    }

    ...
服务

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>
    }
...

接口IModelService{ 模型获取(可序列化id) 作废删除(可序列化id) 模型保存(模型) } @服务(模型) 抽象类ModelService实现IModelService{ private DetachedCriteria buildCriteria(映射参数){ 新的DetachedCriteria(模型)。生成{ if(参数q){ 或{ ilike('name',“%${params.q}%”) ilike('code',“%${params.q}%”) ilike('url',“%${params.q}%”) } } if(参数代码){ 等式(“代码”,参数代码) } if(参数名称){ 等式('name',参数名称) } if(params.url){ eq('url',参数url) } } } 列表搜索(映射参数){ buildCriteria(params).list(params)as list } ...
我用一个外部抽象类解决了这个问题:

型号

class Model{ 
    String id
    String code
    String name
    String url

...

@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()
导入grails.gorm.DetachedCriteria
抽象类DetachedCriteriaService{
受保护的DetachedCriteria buildCriteria(映射参数){
新的DetachedCriteria(getClazz()).build{
if(参数q){
或{
getQSearchFields()。每个{
ilike(它,“%${params.q}%”)
}
}
}
getFields().intersect(params.keySet())。每个{
List parts=it.split(“:”)*.trim()
字符串元素=部分[0]
字符串筛选器=部分[1]?:“eq”
开关(筛选器){//TODO实现器inList
案例“eq”:
eq元素,参数[元素]
打破
案例“ne”:
ne元素,参数[元素]
打破
案例“gt”:
gt元素,参数[元素]
打破
案例“lt”:
lt元素,参数[元素]
打破
案例“ge”:
ge元素,参数[元素]
打破
案例“le”:
le元素,参数[元素]
打破
案例“like”:
like元素,params[元素]
打破
案例“ilike”:
ilike元素,params[元素]
打破
违约:
eq元素,参数[元素]
}
}
}
}
抽象类getClazz()

我用一个外部抽象类解决了这个问题:

型号

class Model{ 
    String id
    String code
    String name
    String url

...

@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()
导入grails.gorm.DetachedCriteria
抽象类DetachedCriteriaService{
受保护的DetachedCriteria buildCriteria(映射参数){
新的DetachedCriteria(getClazz()).build{
if(参数q){
或{
getQSearchFields()。每个{
ilike(它,“%${params.q}%”)
}
}
}
getFields().intersect(params.keySet())。每个{
List parts=it.split(“:”)*.trim()
字符串元素=部分[0]
字符串筛选器=部分[1]?:“eq”
开关(筛选器){//TODO实现器inList
案例“eq”:
eq元素,参数[元素]
打破
案例“ne”:
ne元素,参数[元素]
打破
案例“gt”:
gt元素,参数[元素]
打破
案例“lt”:
lt元素,参数[元素]
打破
案例“ge”:
ge元素,参数[元素]
打破
案例“le”:
le元素,参数[元素]
打破
案例“like”:
like元素,params[元素]
打破
案例“ilike”:
ilike元素,params[元素]
打破
违约:
eq元素,参数[元素]
}
}
}
}
抽象类getClazz()