2014-04-16 1 views
6

Grails offre la possibilità di creare una semplice proprietà delle stringhe/valore delle mappe sezione "Maps of Objects", first paragraph.Grails: query o criteri in base a una coppia/valore delle proprietà della mappa di coppie

Mi chiedevo, c'è un modo per interrogare in seguito la classe di dominio (utilizzando finder dinamici di Gorm, criteri o HQL) usando la proprietà map come parte della query (cioè aggiungendo una condizione per la chiave X per avere il valore Y)?

risposta

2

Dopo aver giocato un po 'e quasi rinunciare, ho scoperto la sintassi della mappa per (sorprendentemente) lavorare in HQL. Supponendo che la classe si presenta come:

class SomeClass { 
    Map pairKeyProperty 
} 

È possibile creare query che somigliano quanto segue:

select * from SomeClass sc where sc.pairKeyProperty['someKey'] = 'someValue' and sc.pairKeyProperty['someOtherKey'] = 'someOtherValue' 

Abbastanza pulito! Preferisco comunque utilizzare i criteri in quanto sono molto più chiari da comporre, ma sembrano non supportare la stessa sintassi (o non riuscivo a trovarla).

Ho creato un'applicazione di esempio in GitHub: https://github.com/deigote/grails-simple-map-of-string-value-pairs

Può essere visisted a: http://grails-map-of-string-pairs.herokuapp.com/

1

Il modulo qui sopra utilizza un cross join. Per imporre un inner join uso

join sc.pairKeyProperty pk1 on index(pk1) = 'someKey' 
where 'someValue' in elements(pk1) 
+0

meglio usare "membro di" anziché "elementi:" join pk1 sc.pairKeyProperty sull'indice (PK1) = 'someKey' dove 'someValue' membro di PK1 Qualcuno sa come applicare un join interno e avere ancora operatori di confronto ("mi piace", "ilike") invece dei soli test di appartenenza? – jphiloon

+0

Hey jphiloon, grazie per la risposta! Mi chiedevo se ci fosse qualche differenza di prestazioni tra i due join quando il cross join usa il "dove" correttamente - la mia ultima comprensione è che non c'è, ma forse ho sbagliato. – Deigote