首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导出模型属性的DetachedCriteria默认查询

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

Stack Overflow用户
提问于 2020-07-20 11:21:07
回答 1查看 27关注 0票数 1

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

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

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

模型

代码语言:javascript
复制
class Model{ 
    String id
    String code
    String name
    String url

...

服务

代码语言:javascript
复制
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>
    }
...
EN

回答 1

Stack Overflow用户

发布于 2020-07-22 12:22:09

我用一个外部抽象类解决了它的创建问题:

模型

代码语言:javascript
复制
@Service(Model)
abstract class ModelService extends DetachedCriteriaService implements IModelService {

    @Override
    Class getClazz(){
        Model
    }

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

    ...

外部类

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62994284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档