2017-08-18 71 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世界)