10

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

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:集合不是关联:example.Cat.nicknames

所以问题是,我如何查询字符串类型的 hasMany?

4

3 回答 3

14

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

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

诀窍是使用'n。元素'

于 2014-06-13T18:43:15.390 回答
8

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

Cat.findAll("from Cat c where :nicknames in elements(c.nicknames)", [nicknames:'kitty'])
于 2011-09-23T16:21:39.710 回答
0

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

Cat.findAll("from Cat c inner join c.nicknames as n where upper(n) like '%'||?||'%'", [nickname.toUpperCase()])
于 2016-10-05T16:31:26.010 回答