使用hasmany String查询Grails / GORM条件

时间:2011-09-23 14:57:20

标签: grails groovy gorm createcriteria

我有一个像这样的域对象(Cat):

class Cat {
   String name

   static hasMany = [
      nicknames: String
   ]
}

(猫有一个名字,也有许多昵称(字符串))

我正在尝试查询所有带有某些昵称的猫。

我试过这个:

PagedResultList getCatsByNickname(String nickname, Map params) {
   PagedResultList results = Cat.createCriteria().list(params) {
      'ilike'('nicknames','%'+nickname+'%')
   }
   return results
}

但它永远不会返回任何结果。 (如果我将查询更改为只使用简单名称属性,它可以找到具有该名称的所有猫,但我想查询昵称。)

我也试过这个:

PagedResultList getCatsByNickname(String nickname, Map params) {
   PagedResultList results = Cat.createCriteria().list(params) {
      'nicknames' {
         'ilike'('nicknames','%'+nickname+'%')
       }
   }
   return results
}

但我收到错误:org.hibernate.MappingException:collection不是关联:example.Cat.nicknames

所以问题是,如何查询类型为String的hasMany?

3 个答案:

答案 0 :(得分:10)

经过大量的尝试和研究,我发现这适用于Grails 2.4.0,我不了解旧版本。

Cat.withCriteria {
    createAlias('nicknames', 'n') 
    ilike 'n.elements', '%kitty%'
}

诀窍是使用' n。元素'

答案 1 :(得分:8)

您可以在这种情况下使用HQL进行查询。例如,

Cat.findAll("from Cat c where :nicknames in elements(c.nicknames)", [nicknames:'kitty'])

答案 2 :(得分:0)

您也可以使用HQL(使用Grails 2.5.0测试):

echo $form->field($model, 'id')->dropDownList( $list, 
     array('onchange'=>"alert( $( this + ' option:selected').val());"));