2012-07-17 19 views
6

Ho una classe come questa:Ottenere gli ID di tutti gli oggetti in un elenco

class Foo { 
    String bar 
} 

Sto cercando di ottenere gli ID di tutti gli oggetti la cui Foobar String è nella lista bars. Ho provato diversi modi, ricevendo sempre lo stesso errore:

java.lang.String cannot be cast to java.util.Collection 

Alcune delle cose che ho provato:

def ids = Foo.findAllByBarInList(bars)*.id 
def ids = Foo.findAllByBarInList(bars).collect{ it.id } 
def ids = Foo.findAllByBarInList(bars).collect{ it -> it?.id } 

UPDATE:

stavo facendo bars con split così era un array, non una lista. Mi ha buttato fuori perché Foo.findAllByBarInList(bars) ha restituito gli oggetti bene, solo quando ho provato a raccogliere gli id ​​ha avuto esito negativo. Ora faccio bars con tokenize e tutto va bene.

+0

Ho aggiunto il tag groovy a questa domanda perché sia ​​il metodo 'collect' che l'operatore di spread' * .' sono basati su groovy. – ubiquibacon

+0

Sei sicuro che la lista che stai controllando sia impostata correttamente come una lista? Usando 'def ids = Foo.findAllByBarInList (barre) *. Id' funziona per me. – Kelly

+2

Lascerei fuori il tag Groovy da quando Grails usa Groovy, quindi non è necessario, ed è solo l'uso di Groovy in Grails, non una domanda specifica di Groovy. Un esperto Groovy che non ha esperienza con Grails non sarebbe in grado di aiutarti. Allo stesso modo puoi omettere i tag Java, GORM, Hibernate, Spring, Programming;) –

risposta

12

che funziona per me tutto il tempo bars è una lista

def bars = ['bar1', 'bar3'] 
def ids = Foo.findAllByBarInList(bars)*.id 

Ma se invece si è il campo id E 'uno spreco di tirare istanze di tutta la classe del dominio dal database. Per ora c'è solo un campo, ma in pratica sarà probabilmente un tavolo più grande. Quindi userei una query HQL:

def ids = Foo.executeQuery(
    'select f.id from Foo f where f.bar in (:bars)', 
    [bars: bars]) 
Problemi correlati