我目前有以下 3 个域类:
用户.groovy
class User {
...
static hasMany = [
...
]
static belongsTo = [
course : Course,
university : University
]
}
Course.groovy
class Course {
String title
static hasMany = [
universities : University,
users : User
]
static belongsTo = University
}
University.groovy
class University {
String name
static hasMany = [
courses : Course,
users : User
]
}
我使用以下代码收集了一所大学的所有类(class):
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或
universities目前正在返回的,我只有
courses 的列表以 JSON 格式返回。我如何限制这个?
请您参考如下方法:
为 Course 注册所需的 JSON 对象编码器在 Bootstrap 中如下:
//Bootstrap
def init = { servletContext ->
JSON.registerObjectMarshaller(Course){
def returnObj = [:]
returnObj.id = it.id
returnObj.title = it.title
returnObj
}
}
上述寄存器只返回
Course 的字段转换并呈现为 JSON 时。请注意,这将永久编码 Course 以仅返回其字段而不是其关联。如果暂时需要,那么您可以很好地遵循 Tim 的方法。
如果您想让它对所有字段都通用,那么:
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注入(inject)
Bootstrap.groovy
补充一点,如果不是为了修改 JSON 的构建方式而是为了协调标准结果,那么使用
projections获得所需的
property :
def courses = Course.withCriteria {
universities {
eq('id', Long.parseLong(params.universityId))
}
projections{
property('id')
property('title')
}
}
更新:
为了将结果检索为映射实体,我将按照 HQL 作为 shown here或使用
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 查询。




