我目前有以下 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 查询。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!