使用hasmany String查询Grails/GORM条件

McD*_*ave 10 grails groovy grails-orm createcriteria

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

class Cat {
   String name

   static hasMany = [
      nicknames: String
   ]
}
Run Code Online (Sandbox Code Playgroud)

(猫有一个名字,也有很多绰号(字符串))

而我正在尝试查询所有具有某些昵称的猫.

我试过这个:

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

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

我也试过这个:

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

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

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

Igo*_*iar 12

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

Cat.withCriteria {
    createAlias('nicknames', 'n') 
    ilike 'n.elements', '%kitty%'
}
Run Code Online (Sandbox Code Playgroud)

诀窍是使用'n.元素 '

  • 在2.4.0中使用此方法时,我仍然得到"org.hibernate.MappingException:collection不是关联" (2认同)
  • 这对我有用,我认为Grails doc中的任何地方都没有记录.谢谢. (2认同)
  • 这对我有用,我找不到任何关于此的文件 (2认同)

ald*_*rin 8

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

Cat.findAll("from Cat c where :nicknames in elements(c.nicknames)", [nicknames:'kitty'])
Run Code Online (Sandbox Code Playgroud)