我目前有以下3个域类:
User.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
]
}
我使用以下代码收集大学的所有课程:
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中返回。我该怎么限制呢?
答案 0 :(得分:2)
在bootstrap中为Course
注册所需的JSON Object marshaller,如下所示:
//Bootstrap
def init = { servletContext ->
JSON.registerObjectMarshaller(Course){
def returnObj = [:]
returnObj.id = it.id
returnObj.title = it.title
returnObj
}
}
以上寄存器仅在转换并呈现为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')
}
}
<强>更新强>
为了将结果检索为映射实体,我将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查询。