2017-08-18 97 views
0

我有一個CarModel和CarModelColor域 關係CarModel的hasMany CarModelColorHQL一對多查詢

CarModel{ 
    String name 
    static hasMany = [carModelColors: CarModelColor] 
} 

CarModelColor{ 
    String color 
} 

現在,如果你通過2色說red and black我們需要所有這些車型其中海兩色ATLEAST。請注意,用戶可以將n個顏色傳遞給該函數,並且結果至少需要n種顏色。

回答

0

可以做如下使用查詢

HQL

select model from CarModel as model 
join model.carModelColors as modelColors 
where modelColors.color in ? 

標準

CarModel.withCriteria { 
    carModelColors { 
     "in"("color", colorList) 
    } 
} 
+0

沒有,如果你用「在」它會給那些只有一個顏色。我需要那些有兩個顏色 – Ashu

+0

@Ashu看看這是否有幫助https://stackoverflow.com/questions/12784960/hibernate-select-entities-where-collection-contains-all-of-the-specified-valus –

0

而是一個簡單的查詢

CarModel{ 
    String name 
    static hasMany = [carModelColors: CarModelColor] 
} 

CarModelColor{ 
    String color 
} 

查詢

String query=""" 
select new map(cm.id as id, cm.name as name, cmc.color as color) from CarModel cm left join carModelColors cmc where cmc.color in (:colorList) 
"" 
Map wp=[:] 
wp.colorList=['red','black'] 
def results = CarModel.executeQuery(query,wp,[readOnly:true]) 

但現在你將結束carModel的儘可能多的迭代他們的顏色,所以如果兩者則2位。

所以,你可以添加一個group by cm.id

以上的訣竅是左連接,顯然in (:list)

您可以刪除選擇新的地圖,如果你喜歡做獲取原始的對象:

String query=""" 
    from CarModel cm where cmc.carModelColors.color in (:colorList) 
    "" 
    Map wp=[:] 
    wp.colorList=['red','black'] 
    def results = CarModel.executeQuery(query,wp,[readOnly:true]) 

當你開始添加左連接時,意味着空值或所有記錄,而不是確定性集合,這是一個連接並且連接也不會返回hasMany,因爲左連接返回所有記錄。

但是,如果你增加了一個左連接

String query=""" 
select new map(cm as carModel) from CarModel cm left join carModelColors cmc where cmc.color in (:colorList) 
"" 
Map wp=[:] 
wp.colorList=['red','black'] 
def results = CarModel.executeQuery(query,wp,[readOnly:true]) 

然後,您可以從results.carModel

得到真正的對象

它都去的軌道,但它表明你都在做同樣的方式它的方式取決於該域對象的情況,有時候我會這樣做,因爲域對象中有很多向前走的好東西可以遠離查詢。

記住的地圖是平的,通常包含元素的平面地圖,並且與周圍傳遞的對象是輕量級(在SQL世界)