Dapatkan ID semua objek dalam daftar

Saya memiliki kelas seperti ini:

class Foo {
    String bar
}

Saya mencoba mendapatkan ID semua objek Foo yang String bar-nya ada dalam daftar bars. Saya sudah mencobanya beberapa cara, selalu menerima kesalahan yang sama:

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

Beberapa hal yang telah saya coba:

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

PEMBARUAN:

Saya membuat bars dengan split jadi itu adalah sebuah array, bukan daftar. Itu membuat saya kesal karena Foo.findAllByBarInList( bars ) mengembalikan Foo objek saya dengan baik, hanya ketika saya mencoba mengumpulkan id barulah gagal. Saya sekarang membuat bars dengan tokenize dan semuanya baik-baik saja.


person ubiquibacon    schedule 17.07.2012    source sumber
comment
Saya menambahkan tag asyik kembali ke pertanyaan ini karena metode collect dan operator penyebaran *. didasarkan pada asyik.   -  person ubiquibacon    schedule 17.07.2012
comment
Apakah Anda yakin daftar yang Anda periksa sudah diatur dengan benar sebagai daftar? Menggunakan def ids = Foo.findAllByBarInList( bars )*.id berfungsi untuk saya.   -  person Kelly    schedule 17.07.2012
comment
Saya akan mengabaikan tag Groovy karena Grails menggunakan Groovy, jadi itu tidak perlu, dan itu hanya penggunaan Groovy dalam Grails, bukan pertanyaan khusus Groovy. Pakar Groovy yang tidak memiliki pengalaman dengan Grails tidak akan dapat membantu Anda. Demikian pula Anda dapat menghilangkan tag Java, GORM, Hibernate, Spring, Pemrograman;)   -  person Burt Beckwith    schedule 17.07.2012


Jawaban (1)


Itu berfungsi untuk saya selama bars adalah Daftar

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

Namun jika yang Anda inginkan hanyalah kolom id, maka sia-sia jika menarik seluruh instance kelas domain dari database. Untuk saat ini hanya ada satu bidang, namun dalam praktiknya kemungkinan besar akan menjadi tabel yang lebih besar. Jadi saya akan menggunakan kueri HQL:

def ids = Foo.executeQuery(
   'select f.id from Foo f where f.bar in (:bars)',
   [bars: bars])
person Burt Beckwith    schedule 17.07.2012