2011-03-31 51 views
1

Grails - 如何在不強制加載整個對象的情況下公開多對一關聯屬性的id?Grails多對一公開ID沒有延遲加載?

class Task { 
    User belongsTo 
    User createdBy 
} 
class User { 
    ... 
} 

我可以得到任務的用戶ID,而不會導致整個用戶對象的延遲加載?有沒有辦法做到這一點,或將涉及每個類的自定義查詢?這實際上涉及DTO對象通過BlazeDS返回 - 我需要的只是ID,而不是相關的對象。

回答

0

默認情況下,Grails已啓用延遲關聯,因此除非啓用預先抓取,否則不必擔心所有鏈接對象的加載。您還可以使用命名查詢或休眠條件投影:

def taskCriteria = Task.createCriteria() 
def users = taskCriteria.list{//or get 
    projections { 
     property "id" 
    } 
    user{ 
     eq("userName", "Joe") 
    } 
} 

上述內容將只提取名爲Joe的用戶的任務ID。

+0

我想什麼做的是一個域對象映射到DTO,與地方相關的類對象的ID(在某些例)。我想依靠hibernate來獲取初始域對象。例如,我可以通過引用「createdBy.id」將用戶子類ID放入dto中。但是,這會導致獲取整個用戶對象,而我只想要該ID。我知道延遲加載代理有權訪問該ID,顯然,因爲這是獲取的關鍵。我想訪問該ID而不會導致抓取。 – jay 2011-04-04 14:45:17

+0

我明白你的意思了,還有一個DTO插件,可以讓你看到的Grails。你有沒有考慮命名查詢?你可以使用它沿預測: http://grails.org/doc/latest/ref/Domain%20Classes/namedQueries.html 以外,你將不得不參考休眠文檔的事情: http:// docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/ – 2011-04-07 21:01:13

0

顯然,你需要使用魔法符號belongsToId和createdById - 見GRAILS-2570