10

次のようなドメイン オブジェクト (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: コレクションは関連付けではありませんでした: example.Cat.nicknames

問題は、タイプ String の hasMany に対してどのようにクエリを実行するかということです。

4

3 に答える 3

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 に答える