projections ilike grails groovy gorm createcriteria

ilike - Consulta de criterios Grails/GORM con hasamy String



grails gorm order by (3)

Tengo un objeto de dominio (Cat) como este:

class Cat { String name static hasMany = [ nicknames: String ] }

(Un gato tiene un nombre, y también tiene muchos apodos (que son cadenas))

Y estoy tratando de consultar a todos los gatos con ciertos apodos.

He intentado esto:

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

Pero nunca devuelve ningún resultado. (Si cambio la consulta para usar simplemente el atributo de nombre simple, funciona buscando todos los gatos con ese nombre, pero quiero consultar contra los apodos).

También intenté esto:

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

Pero obtengo el error: org.hibernate.MappingException: collection no era una asociación: example.Cat.nicknames

Entonces, la pregunta es, ¿cómo consulto contra un hasMany de tipo String?


Después de muchas pruebas e investigaciones, descubrí que esto funcionará con Grails 2.4.0, no sé sobre versiones anteriores.

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

El truco es usar ''n. elementos ''


Puede usar HQL para consultar en dicho escenario. Por ejemplo,

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


También puede usar HQL (probado con Grails 2.5.0):

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