gpt4 book ai didi

json - 使用 withCriteria 时限制数据范围

转载 作者:行者123 更新时间:2023-12-02 14:33:49 24 4
gpt4 key购买 nike

我目前有以下 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}]
}]

我的问题是我想限制响应的范围不包括 usersuniversities目前正在返回的,我只有 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 查询。

关于json - 使用 withCriteria 时限制数据范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19082572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com