2011-09-23 23 views
9

ho un oggetto di dominio (Cat) come questo:Grails/GORM interrogazione criteri con String hasMany

class Cat { 
    String name 

    static hasMany = [ 
     nicknames: String 
    ] 
} 

(Un gatto ha un nome, e ha anche molti soprannomi (che sono stringhe))

E sto cercando di interrogare tutti i gatti con determinati soprannomi.

Ho provato questo:

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

Ma non è mai restituisce alcun risultato. (. Se cambio la query di utilizzare solo l'attributo name semplice, funziona trovando tutti i gatti con quel nome, ma voglio interrogare contro i soprannomi)

Ho provato anche questo:

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

Ma Ho ricevuto l'errore: org.hibernate.MappingException: collection was not an association: example.Cat.nicknames

Quindi la domanda è: come faccio a eseguire una query su hasMany di tipo String?

+1

Alcune persone la stessa domanda: 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

Questo errore sembra essere la causa dell'errore che si sta verificando: [GRAILS-5887] (https://jira.grails.org/browse/GRAILS -5887) – cweston

risposta

7

È possibile utilizzare HQL per l'esecuzione di query in uno scenario di questo tipo. Ad esempio,

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

Grazie per la risposta! Ok, questo mi fa iniziare, ma come posso dire che voglio soprannomi ** come ** kitty? – McDave

+0

Penso che findAll utilizza la sintassi di PostgreSQL, quindi prova% kitty% – bitbucket

+0

% kitty% non funziona. Ho provato questo su MySQL e Hibernate genera uno SQL che sembra "select * da gatto c dove 'gattino' in ( selezionare nicknames_string da cat_nicknames n dove c.id = n.cat_id )" .... sfortunatamente sembra che tu abbia bisogno di usare una clausola OR (nickname come% kitty% 'OR nickname come'% timmy% 'OR ...) – aldrin

9

Dopo un sacco di cercare e di ricerca, ho trovato questo funzionerà con Grails 2.4.0, non so su versioni precedenti.

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

Il trucco è usare 'n. elementi '

+1

Ricevo ancora "org.hibernate.MappingException: collection was not an association" quando si utilizza questo metodo in 2.4.0 – cweston

+1

Questo ha funzionato per me e penso che questo non sia documentato in nessun punto del documento di Grails. Grazie. –

+1

Questo funziona per me e non riesco a trovare alcun documento su questo – Samuel

0

È inoltre possibile utilizzare HQL (testati con Grails 2.5.0):

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