比较简单的查询
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 世界中)