【问题标题】:HQL one to many queryHQL 一对多查询
【发布时间】:2018-01-26 15:17:51
【问题描述】:

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

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

CarModelColor{
  String color
}

现在,如果您通过 2 种颜色说 red and black,我们需要所有至少两种颜色的模型。请注意,用户可以将 n 种颜色传递给该函数,结果至少需要 n 种颜色。

【问题讨论】:

    标签: sql grails hql grails-orm


    【解决方案1】:

    可以在查询中使用如下方式完成

    HQL

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

    标准

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

    【讨论】:

    【解决方案2】:

    比较简单的查询

    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 世界中)

    【讨论】:

      猜你喜欢
      • 2010-11-13
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 2013-09-19
      相关资源
      最近更新 更多