Запрос критериев Grails / GORM со строкой hasmany - PullRequest
10 голосов
/ 23 сентября 2011

У меня есть объект домена (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

Итак, вопрос в том, как выполнить запрос к hasMany типа String?

Ответы [ 3 ]

10 голосов
/ 13 июня 2014

После долгих попыток и исследований я обнаружил, что это будет работать с Grails 2.4.0, я не знаю о старых версиях.

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

Хитрость заключается в том, чтобы использовать 'n. элементы

8 голосов
/ 23 сентября 2011

Вы можете использовать HQL для запросов в таком сценарии.Например,

Cat.findAll("from Cat c where :nicknames in elements(c.nicknames)", [nicknames:'kitty'])
0 голосов
/ 05 октября 2016

Вы также можете использовать HQL (протестировано с Grails 2.5.0):

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