2013-08-23 58 views
1

從子表中的某些行,我有兩個領域是這樣的:如何獲得在格姆

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

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

我想找出所有colors有任何shades不可用:

所以如果我的數據是這樣的:

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,因爲他們有一些遮陽是012色的項目

我嘗試這樣做查詢,但我不能完全肯定這是否會回到我想要的

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

當我查看由休眠此生成的SQL,我沒有注意到任何group by條款和SELECT語句從兩個colorshade

+0

是答案有幫助嗎? – dmahapatro

回答

1

您可以使用標準或HQL得到coloumns得到你需要的東西:

//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(使關係更鮮明)。

0

HQL是最簡單的IMO

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