Grails/GORM条件查询具有多个字符串

Grails/GORM条件查询具有多个字符串,grails,groovy,gorm,createcriteria,Grails,Groovy,Gorm,Createcriteria,我有一个域对象Cat,如下所示: class Cat { String name static hasMany = [ nicknames: String ] } 猫有名字,也有许多昵称,这些昵称都是字符串 我试图询问所有有特定昵称的猫 我试过这个: PagedResultList getCatsByNickname(String nickname, Map params) { PagedResultList results = Cat.createCri

我有一个域对象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
}
但它从不返回任何结果。如果我将查询更改为仅使用simple name属性,那么它可以查找所有具有该名称的猫,但我想查询昵称

我也试过:

PagedResultList getCatsByNickname(String nickname, Map params) {
   PagedResultList results = Cat.createCriteria().list(params) {
      'nicknames' {
         'ilike'('nicknames','%'+nickname+'%')
       }
   }
   return results
}
但是我得到了错误:org.hibernate.MappingException:集合不是关联:example.Cat.昵称


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

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

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

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

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

诀窍是使用“n.elements”

您还可以使用经过Grails 2.5.0测试的HQL:

Cat.findAll("from Cat c inner join c.nicknames as n where upper(n) like '%'||?||'%'", [nickname.toUpperCase()])

谢谢你的回复!好的,这让我开始了,但是我怎么说我想要像kitty这样的昵称呢?我认为findAll使用了PostgreSQL语法,所以尝试一下%kitty%%kitty%不起作用。我在mysql上尝试了这一点,hibernate生成了一个sql,看起来像是从cat c中选择*,其中从cat_昵称n中选择昵称n中的'kitty',其中c.id=n.cat_id…不幸的是,您似乎需要使用OR子句昵称如%kitty%”或昵称如“%timmy%”或…对。。。我在想Like或Ilike。有些人问了同样的问题:这个bug似乎是导致您出现错误的原因:我仍然得到org.hibernate.MappingException:在2.4.0中使用此方法时,集合不是一个关联。这对我来说很有效,我认为Grails文档中没有任何地方记录这一点。谢谢。这对我有用,我找不到任何关于这方面的文件