Grails:许多桌子上的投影?

时间:2011-04-24 16:09:00

标签: grails criteria gorm projection

我在Grails中有一些投影问题。你能帮我复习一下并为我提出解决方案吗?

  1. 我想查询许多表上的数据,这些表具有多对一的关系,并在两者上的某些属性上进行投影。例如:

    class Person {
        int id
        String name
        String address
        static hasMany = [cars : Car]
    }
    
    class Car {
       int id
       String brand
       long price
       Person owner
       static belongsTo = [owner : Person]
    }
    

    那么,我如何只使用一个带有标准的查询(应用投影)来获取指定汽车的信息(包括品牌,价格和所有者名称)?是否可以使用:

    Car.withCriteria {
         projections {
             property("brand")
             property("price")
             property("owner.name")
        }
        eq("id", carId)
    }
    
  2. 我可以使用投影获取一个指定人员的信息以及他所有车辆的名称吗?例如:[01,Perter,01 Street A,[Mercedes,Toyota,Ducatti]]?

  3. 特殊情况:(以上人员类)
    一个人可以加入许多组织,组织可以有一个“父母”组织(反之亦然,组织可以有许多其他依赖组织)。但是有一个规则:一个人只能加入一个特定组织的一个儿童组织。因此,对于给定的组织O和人P,获得P的信息的最快方式是什么,以及具有P作为成员的O的依赖组织的名称。我更喜欢使用Grails投影。

    这是数据模型:

    class Person {
        int id
        String name
        String address
        static hasMany = [joinedOrgs : Organization] 
    }
    
    class Organization {
        int id
        String name
        Organization parentOrg
        static hasMany = [members : Person, childOrgs : Organization]
    }
    
  4. 我是Grails的新手,我想更了解GORM。非常感谢你的帮助。

3 个答案:

答案 0 :(得分:9)

试试这个

def results =  Car.createCriteria().list() { 
    createAlias('owner','owner')
    projections { 
        property('owner.name', 'owner.name') 
        property('brand','brand')
        property('price','price')
    }
}

答案 1 :(得分:3)

对于(第1号)我认为你在寻找的是

http://grails.1312388.n4.nabble.com/grails-reports-page-multiple-domain-criteria-join-td3510604.html

    def criteria = Company.createCriteria() 
    def results =  criteria.list { 
        projections { 
                property('id', 'company.id') 
                ... 
                POCs{ 
                        property('id', 'poc.id') 
                        property('name', 'poc.name') 
                } 
                software { 
                        productKey { 
                                ... 
                                } 
                } 
                ... 
                order(company.name,'asc') 
        }

帖子使用.createCriteria()

突出显示

答案 2 :(得分:1)

对于(1)和(2),我不知道是否有办法通过一个标准查询来做你想要的东西,但另一种方法似乎更简单和自然。对于(1):

def car = Car.get(carId)
def owners = car.owner?.name

对于(2)

def person = Person.get(personId)
def cars = person.cars*.name

关于(3),这里有一种设计问题。您当前的域设计不反映您描述的规则,因此很难维护该约束。您可以考虑映射PersonOrganization表和make childrenOrganization a transient property。例如:

class Organization {
    int id
    String name
    Organization parent
    static transients = ['children']
    ...

    Boolean children() {
        def children = Organization.createCriteria().list() { 
            eq ('parent', this) 
        }
        return children
    }
}

之后,您可以使用跟踪功能(如getAllAncestors())来确定组织的所有父级层次结构,并在人员组织列表中查找。这似乎不是最好的方式,但这是一种可能的方式。