如何从GORM中的子表中获取某些行

时间:2013-08-23 00:09:31

标签: grails gorm

我有两个这样的域名:

class Color {
  static hasMany = [shade: Shade]
  String colorName
  String colorType
}

class Shade {
  static belongsTo = [color: Color]
  String shadeName
  boolean isAvailable
}

我想找出所有colorsshades不可用的内容:

所以如果我的数据是这样的:

ID     color_name    color_type
----    --------      ----------
22       RED           CRAYON
23       GREEN         PAINT
45       GREY          CRAYON

ID     color_id       shade_name     is_available
---    ----------     -------------   ----------
2      22              DARK           false
3      22              LIGHT          true
4      23              DARK           true
5      23              LIGHT          true
6      45              DARK           false
7      45              LIGHT          false

我希望我的结果大小为2,其中包含ids 22 and 45的颜色项,因为它们有一些not available

的阴影

我尝试了这个查询,但我不完全确定这是否会返回我想要的内容

def query = Color.where {
 shade.isAvailable == false
}
def list = query.list()

当我查看hibernate为此生成的sql时,我没有注意到任何group by子句,并且select语句从colorshade获得了颜色

2 个答案:

答案 0 :(得分:1)

您可以使用Criteria或HQL来获取所需内容:

//Criteria Approach:
//In this approach "shade" will be fetched eagerly with color
def colors = Color.createCriteria().listDistinct{
    shade{
        eq('isAvailable', false)
    }
}

//HQL
//In this approach only color will be fetched
//without shade, unless specified as ".... inner join fetch c.shade ..."
def colors = Color.executeQuery("select distinct c from Color as c \
                                 inner join c.shade as s \
                                 where s.isAvailable is false")

我更喜欢hasMany关联的复数符号,因此我会使用shades代替shade(使关系更加生动)。

答案 1 :(得分:0)

HQL是最简单的IMO

Shade.executeQuery("select distinct s.color from Shade s where s.isAvailable = false")