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

标签 grails groovy gorm

我是grails / gorm的新手,正在为前端调用构建API。我正在使用DetachedCriteria进行查询和过滤,发现我正在复制太多代码...
对于模型的每个类,我必须编写DetachedCriteria来创建每个属性的“eq”和“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()

关于grails - 导出DetachedCriteria对模型属性的默认查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62994284/

相关文章:

grails - 保存新记录时动态发现关系的更好方法? (对方失败)

Jenkins 声明式管道 - 如何获取正在使用的 Jenkinsfile 的路径?

grails - 具有多个域的Grails Web流

grails - grails gorm存储多对多关系的日期的方式hp

grails - Grails Spring Security创建不在bootstrap.groovy中的帐户

rest - 如何将 CORS 与 grails rest API 一起使用?

grails - grails 在哪里存储自生成的 SSL 证书?

chalice 3 : ServletContext is coming null in grails service

grails - 为什么 GORM 使用 methodMissing

groovy - Groovy "as"运算符是否在运行时为用户定义的类创建子类?