使用 hasmany 字符串查询 Grails / GORM 条件

Posted

技术标签:

【中文标题】使用 hasmany 字符串查询 Grails / GORM 条件【英文标题】:Grails / GORM criteria query with hasmany String 【发布时间】:2011-09-23 14:57:19 【问题描述】:

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

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 was not an association: example.Cat.nicknames

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

【问题讨论】:

有人问同样的问题:grails.1312388.n4.nabble.com/…grails.1312388.n4.nabble.com/… 这个错误似乎是你得到错误的原因:GRAILS-5887 【参考方案1】:

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

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

诀窍是使用 'n.elements'

【讨论】:

在 2.4.0 中使用此方法时,我仍然得到“org.hibernate.MappingException: collection was not an association” 这对我有用,我认为这在 Grails 文档的任何地方都没有记录。谢谢。 这对我有用,我找不到任何关于这个的文件【参考方案2】:

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

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

【讨论】:

感谢您的回复!好的,这让我开始了,但是我要怎么说我想要昵称 like kitty? 我觉得findAll使用的是PostgreSQL语法,所以试试%kitty% %kitty% 不起作用。我在mysql上试过这个,hibernate会生成一个看起来“select * from cat c where 'kitty' in (selectnicknames_string from cat_nicknames n where c.id=n.cat_id)”的sql ....不幸的是,你似乎需要使用 OR 子句(昵称如 %kitty%' 或昵称如 '%timmy%' OR ...) 对...我在想 Like 或 Ilike。【参考方案3】:

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

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

【讨论】:

以上是关于使用 hasmany 字符串查询 Grails / GORM 条件的主要内容,如果未能解决你的问题,请参考以下文章

Grails - 简单的 hasMany 问题 - 在 create.gsp 中使用 CheckBoxes 而不是 HTML Select

Grails:如何在 hasMany 关系中搜索孩子?

grails中hasMany关系的选择性深度渲染

grails:脚手架为具有 hasMany 关系的域创建视图

为啥grails在第一次访问hasMany关系时抛出空指针异常?

Grails 获取子域对象