注册您所需的 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 查询。