2011-09-23 19 views
9

que tengo un objeto de dominio (CAT) como este:Grails/GORM criterios de consulta con la cadena hasMany

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 de la consulta sólo tiene que utilizar el atributo de nombre sencillo, funciona la búsqueda de todos los gatos con ese nombre, pero quiero consulta contra los apodos)

También probé esto:

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

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

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

+1

Algunas personas hacen la misma pregunta: ¿http://grails.1312388.n4.nabble.com/Criteria -query-on-properties-of-type-List-lt-String-gt-td1325707.html http://grails.1312388.n4.nabble.com/GORM-how-to-set-criteria-for-object -with-list-or-set-of-strings-td1388277.html – McDave

+0

Este error parece ser la causa del error que está recibiendo: [GRAILS-5887] (https://jira.grails.org/browse/GRAILS -5887) – cweston

Respuesta

7

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

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

¡Gracias por su respuesta! Bien, esto me ayuda a comenzar, pero ¿cómo puedo decir que quiero apodos ** como ** gatito? – McDave

+0

Creo que findAll usa la sintaxis de PostgreSQL, por lo que intenta% kitty% – bitbucket

+0

% kitty% no funciona. He intentado esto en MySQL y SQL genera una hibernación que se ve "seleccione * de gato c donde 'gatito' en ( seleccionar nicknames_string de cat_nicknames n donde c.id = n.cat_id )" ... desafortunadamente parece que necesitarías usar una cláusula OR (apodo como% kitty% 'O apodo como'% timmy% 'O ...) – aldrin

9

Después de un montón de tratar e investigar, descubrí que esto funcionará con Grails 2.4.0, no sé acerca de las versiones más antiguas.

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

El truco es usar 'n. elementos '

+1

Todavía obtengo "org.hibernate.MappingException: la colección no era una asociación" cuando se usa este método en 2.4.0 – cweston

+1

Esto funcionó para mí y creo que esto no está documentado en ninguna parte del documento de Grails. Gracias. –

+1

Esto funciona para mí y no puedo encontrar ningún documento sobre esto – Samuel

0

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()]) 
Cuestiones relacionadas