2011-04-24 28 views
8

我在Grails中有一些投影問題。你能幫我回顧一下併爲我提供解決方案嗎?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] 
    } 
    

    所以,我怎麼可以只使用一個查詢withCriteria(適用投影)來獲得指定的汽車(包括品牌,價格和所有者名稱)的信息?是否有可能使用:

    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] 
    } 
    

我與Grails的一個新手,我想了解GORM得多。非常感謝你的幫助。

回答

1

對於(1)和(2),我不知道是否有一種方法可以用1個標準查詢來完成您想要的操作,但另一種方式似乎更簡單自然。對於(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回溯()函數來確定一個組織的所有父層次結構中,看看它在個人與組織的名單。這似乎不是最好的方式,但這是一種可能的方式。

10

試試這個

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

爲什麼了'alias'所需要的崗位亮點? – 2015-07-08 13:33:43

+0

@AlexanderSuraphel沒有別名,您不能直接在 'property('owner.name','owner.name')' 中直接訪問'owner.name'即使您可以在沒有別名的情況下獲得上述結果,但您需要爲此編寫更多代碼。見下面的例子 '預測{ 所有者{ 屬性( '名', '名') } 財產( '品牌', '品牌') 財產( '價格', '價格') }' 請讓我知道你是否仍然有任何困惑,或者對你而言這不是一個正確的答案。 謝謝 – 2015-10-15 08:15:42

+0

@AlexanderSuraphel如果你可以在沒有createAlias('owner','owner')'的情況下編寫上面的代碼,可能在grails的新版本中可能會有效。 – 2015-10-15 08:19:57