使用 withCriteria 时限制数据范围

2023-11-30

我目前有以下 3 个域类:

用户.groovy

class User {
    ...

    static hasMany = [
        ...
        ]

    static belongsTo = [        
        course : Course,
        university : University     
        ]

}

课程.groovy

class Course {

    String title

    static hasMany = [
        universities : University, 
        users : User
        ]

    static belongsTo = University       

}

大学.groovy

class University {

    String name

    static hasMany = [
        courses : Course,
        users : User
        ]           
}

我使用以下代码收集了一所大学的所有课程:

def courses = Course.withCriteria {      
          universities {
            eq('id', Long.parseLong(params.universityId))
          }
        }
        render courses as JSON  

响应示例如下:

[{
            "class":"classifieds.Course",
            "id":1,
            "title":"Computer Science",
            "universities":
                [{"class":"University",
                    "id":1}],
            "users":
                [{"class":"User"
                    ,"id":1}]
        }]

我的问题是我想限制响应的范围以不包括users or universities目前正在退回,我只列出了courses以 JSON 形式返回。我该如何限制这个?


注册您所需的 JSON 对象编组器Course在引导程序中如下:

//Bootstrap
def init = { servletContext ->
    JSON.registerObjectMarshaller(Course){
        def returnObj = [:]
        returnObj.id = it.id
        returnObj.title = it.title

        returnObj
    }
}

上述寄存器仅返回以下字段Course转换并呈现​​为 JSON 时。请注意,这将永久编组 Course 以仅返回其字段而不返回其关联。如果暂时需要,那么您可以很好地遵循蒂姆的方法。

如果您想让它对所有字段通用,那么:

JSON.registerObjectMarshaller(Course){course ->
    def fields = grailsApplication.domainClasses
                                  .find{it.name == 'Course'}
                                  .properties
                                  .findAll{!it.association}
                                  .name - 'version' //Remove version if req.

    return fields.collectEntries{[it, course."$it"]}
}

假如grailsApplication被注入到Bootstrap.groovy

添加,如果目的不是修改 JSON 的构建方式,而是协调标准结果,则使用projections以获得所需的property:

def courses = Course.withCriteria {      
   universities {
     eq('id', Long.parseLong(params.universityId))
   }
   projections{
      property('id')
      property('title')
   }
}

UPDATE:
为了将结果检索为映射实体,我将遵循 HQL此处显示 or use createCriteria并将结果转换为如下图(未经测试):

import org.hibernate.transform.Transformers

def criteria = Course.createCriteria()
criteria.resultTransformer(Transformers.ALIAS_TO_ENTITY_MAP)
def courses = criteria.list {      
   universities {
     eq('id', Long.parseLong(params.universityId))
   }
   projections{
      property('id')
      property('title')
   }
}

我不确定属性名称是否会创建别名。如果您遇到任何问题,您可以快速回退到 HQL 查询。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 withCriteria 时限制数据范围 的相关文章

随机推荐