HQL一对多查询

时间:2017-08-18 03:36:59

标签: sql grails hql gorm

我有一个CarModel和CarModelColor域 关系是CarModel hasMany CarModelColor

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

CarModelColor{
  String color
}

现在,如果你传递两种颜色red and black,我们需要所有那些颜色至少都是颜色的模型。请注意,用户可以将n种颜色传递给该功能,结果至少需要n种颜色。

2 个答案:

答案 0 :(得分:0)

可以在查询

中使用以下方式完成

<强> HQL

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

<强>标准

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

答案 1 :(得分: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迭代颜色,所以如果两者都找到了两个。

所以你可以添加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世界中)相比是轻量级的