如何在Grails withCriteria中进行“深度”转换包含投影?

时间:2013-12-30 16:19:31

标签: grails gorm createcriteria

我使用Grails 2.2.4构建Web应用程序,现在我遇到了Grails withCriteria操作的复杂问题。我有3个课程如下:

class Person {
    int id
    String name
    Set<Car> cars = []  // One-to-many relationship
    Company currentCompany // One-to-one relationship
}

class Car {
    int id
    String manufacturer
    String brand
    double price
    Person owner
}

class Company {
    int id
    String name
    Set<Person> employees = []
}

现在我想查询来自Person的数据作为根类以及相关的数据,如下所示:

List result = Person.withCriteria {
    projections {
        property('id')
        property('name')
        createAlias('cars', 'c', CriteriaSpecification.LEFT_JOIN)
        property('c.brand')
        createAlias('currentCompany', 'com', CriteriaSpecification.LEFT_JOIN)
        property('com.name')
    }
        lt('id', 10L)
        resultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
}

问题是,我不知道如何将结果数据深度转换为人员列表,以确保每个元素都包含其数据作为类结构。我尝试过很多方法,比如

    resultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
    resultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP)
    resultTransformer(CriteriaSpecification.aliasToBean(Person.class))  

但没有像我预期的那样有效 Grails 2.2.4是否支持此功能?如果是,那么正确的语法是什么? 非常感谢你。

1 个答案:

答案 0 :(得分:0)

实际上,在研究了许多文章,Grails文档甚至是源代码之后,我认为最好的方法是为我自己的目的实现自定义变换器。这里最困难的是如何将数据转换为关联对象并将它们收集到根实体内的集合。我在这里创建了一个: http://www.mycodestock.com/code/10333/
希望它可以帮助那些可能需要像我这样的人。