而是一个简单的查询
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世界)
没有,如果你用“在”它会给那些只有一个颜色。我需要那些有两个颜色 – Ashu
@Ashu看看这是否有帮助https://stackoverflow.com/questions/12784960/hibernate-select-entities-where-collection-contains-all-of-the-specified-valus –