1

我有幾個場景,我想檢索一個單一的Advertiser並渴望獲取大部分對象圖。我絕對不想在默認情況下這樣做,所以我一直在尋找正確的方法來爲單個查詢做到這一點。這是我到目前爲止:是否有更清晰,更Grailsy的方式來編寫此查詢?

Advertiser.createCriteria().get { 
     eq('id', id) 
     createAlias('foos', 'foos', CriteriaSpecification.LEFT_JOIN) 
     createAlias('foos.bars', 'bars', CriteriaSpecification.LEFT_JOIN) 
     createAlias('bars.baz', 'bazzes', CriteriaSpecification.INNER_JOIN) 
    } 

這工作,但我不喜歡它的原因有幾個。

  1. 這似乎是一個非常間接和不直觀的方式來說「只需加入dang表。
  2. 沒有編譯時檢查。如果foos關聯在Advertiser上不存在,則編譯器不會在意。

以下是我真的很想看到它的工作:

Advertiser.where { 
    id == id 
    foos { 
     bars { 
      baz 
     } 
    } 
} 

但是,這並不做任何加盟;顯然,如果你實際上沒有指定該屬性的條件(><==等),它會忽略你。

我有什麼選擇?我怎樣才能讓這個更直觀的閱讀?尋找最接近我的理想,因爲我可以得到。

編輯

我嘗試下面的一些建議,事情不工作,也可能是部分原因是因爲我沒有收到我的語法正確。比方說,我需要急於獲取額外的1級協會呼籲whatsits

我試圖做這種方式:

Advertiser.withCriteria { 
    idEq(id) 
    whatsits 
    foos { 
     bars { 
      baz 
     } 
    } 
} 

我也試過

Advertiser.withCriteria { 
    idEq(id) && whatsits && foos { 
     bars { 
      baz 
     } 
    } 
} 

但不同方法會產生不同的例外情況,看起來很奇怪的查詢等等。

回答

0

這不像您的第一個例子,但您可能會或可能不會更直觀?

def result = Advertiser.withCriteria { 
    eq('id', id) 
    fetchMode 'foos', FetchMode.JOIN 
    fetchMode 'foos.bars', FetchMode.JOIN 
    fetchMode 'bars.baz', FetchMode.JOIN 
} 
+0

這個問題使用1個INNER_JOIN和2個LEFT_JOINs。 FetchMode.JOIN將導致3個INNER JOIN。 – 2017-05-06 06:30:27

0

您可以使用DSL的createCriteria/withCriteria根據您所where子句中使用,它們在默認情況下eagerly牽強。你得到的結果是一個列表,所以應該是result[0]

def result = Advertiser.withCriteria { 
    idEq(id) 
    foos{ 
     bars{ 
      baz{ 

      } 
     } 
    } 
} 

得到結果,你可以查看你是否有關聯目前,也就是

if(result[0].foos){...}

更新後

請參閱本Sample Code瞭解詳情。

UPDATE2

&&||==不能在標準中使用。他們有專門的DSL用於像and{}or{}eq()相同的操作。看看Grails Criteria

Advertiser.withCriteria { 
    idEq(id) 
    whatsits{} 
    foos { 
     bars { 
      baz 
     } 
    } 
} 
+0

有沒有辦法告訴它只獲取一個對象,比如'createCriteria()。get'在我的例子中呢? – Samo 2013-05-07 15:31:38

+0

在上面的例子中,由於我們正在對主鍵「id」進行讀取,所以它只會提取一個對象。不是嗎?您可以使用'createCriteria()。get'來獲取與對象本身相同的結果,而不是作爲一個對象的列表。 – dmahapatro 2013-05-07 16:21:22

+0

另外,這不起作用。我得到「沒有這樣的屬性:foos的類:grails.orm.HibernateCriteriaBuilder」 – Samo 2013-05-07 16:26:06

相關問題