รับ ID ของวัตถุทั้งหมดในรายการ

ฉันมีชั้นเรียนเช่นนี้:

class Foo {
    String bar
}

ฉันกำลังพยายามรับ ID ของวัตถุ Foo ทั้งหมดที่มี bar String อยู่ในรายการ bars ฉันได้ลองหลายวิธีแล้ว แต่ได้รับข้อผิดพลาดเดิมเสมอ:

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

บางสิ่งที่ฉันได้ลอง:

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

อัปเดต:

ฉันกำลังสร้าง bars ด้วย แยก ดังนั้นมันจึงเป็นอาร์เรย์ ไม่ใช่รายการ มันทำให้ฉันผิดหวังเพราะ Foo.findAllByBarInList( bars ) ส่งคืนออบเจ็กต์ Foo ของฉันได้ดี แต่เมื่อฉันพยายามรวบรวมรหัสเท่านั้นจึงจะล้มเหลว ตอนนี้ฉันสร้าง bars ด้วย tokenize แทน และทุกอย่างก็เรียบร้อยดี


person ubiquibacon    schedule 17.07.2012    source แหล่งที่มา
comment
ฉันเพิ่มแท็ก Groovy กลับไปที่คำถามนี้ เนื่องจากทั้งวิธี collect และตัวดำเนินการสเปรด *. นั้นมีพื้นฐานมาจาก Groovy   -  person ubiquibacon    schedule 17.07.2012
comment
คุณแน่ใจหรือว่ารายการที่คุณกำลังตรวจสอบได้รับการตั้งค่าอย่างถูกต้องเป็นรายการ? การใช้ def ids = Foo.findAllByBarInList( bars )*.id เหมาะกับฉัน   -  person Kelly    schedule 17.07.2012
comment
ฉันจะทิ้งแท็ก Groovy ไว้เนื่องจาก Grails ใช้ Groovy ดังนั้นจึงไม่จำเป็น และเป็นเพียงการใช้ Groovy ภายใน Grails ไม่ใช่คำถามเฉพาะของ Groovy ผู้เชี่ยวชาญ Groovy ที่ไม่มีประสบการณ์เกี่ยวกับ Grails จะไม่สามารถช่วยคุณได้ ในทำนองเดียวกันคุณสามารถละเว้นแท็ก Java, GORM, Hibernate, Spring, Programming ;)   -  person Burt Beckwith    schedule 17.07.2012


คำตอบ (1)


นั่นใช้ได้ผลสำหรับฉันตราบใดที่ bars เป็นรายการ

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

แต่ถ้าคุณต้องการเพียงฟิลด์ id การดึงอินสแตนซ์คลาสโดเมนทั้งหมดออกจากฐานข้อมูลก็เปล่าประโยชน์ สำหรับตอนนี้มีเพียงช่องเดียว แต่ในทางปฏิบัติน่าจะเป็นตารางที่ใหญ่กว่า ดังนั้นฉันจะใช้แบบสอบถาม 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