2015-06-11 23 views
0

我有兩個域Grails的格姆查詢限制

class ProductQuantity { 
    Integer quantity 

    static belongsTo = [productSize: ProductSize] 
} 

class ProductSize { 

    String size 

    static hasMany = [productQuantities : ProductQuantity] 
} 

我試圖建立一個查詢從哪裏獲得由productSize所有的產品數量。我有以下查詢的作品。

def productSize = ProductSize.findAllById(1); 
def productQuantities = ProductQuantity.findAllByProductSize(productSize) 

我期待在一個查詢中獲得ProductQuanties而不是兩個單獨的查詢。

回答

2
ProductQuantity.createCriteria().list { 
    eq 'productSize', ProductSize.load(1) 
} 

ProductQuantity.withCriteria { 
    eq 'productSize', ProductSize.load(1) 
} 

ProductQuantity.where { 
    productSize == ProductSize.load(1) 
}.list() 

ProductQuantity.findAll("from ProductQuantity where productSize = ?", [ProductSize.load(1)]) 
+0

您使用負載的任何特定原因? –

+3

'load'在這裏比'get'更有意義。 'get'強制執行數據庫查詢,可能包括許多列,大字符串等。所有'ProductSize'實例用於獲取其'id'作爲最終SQL中的外鍵。 'get'效率低下,因爲你丟棄了從數據庫中檢索到的所有數據,只使用你已經知道的一個值 - 'id'。用'load()'你可以得到一個Hibernate代理。它具有'id'值,如果您訪問任何其他屬性,將使用它來檢索完整實例。但因爲你不會,所以沒有不必要的數據庫訪問。 –

1

是的,你可以通過createCriteria得到這個,就像 -

def productQuantities = ProductQuantity.createCriteria().list() { 
    productSize { 
     eq('id', 1) 
    } 
}