2012-07-17 36 views
6

Tôi có một lớp học như thế này:Lấy ID của tất cả các đối tượng trong danh sách

class Foo { 
    String bar 
} 

tôi đang cố gắng để có được ID của tất cả các đối tượng có Foobar String là trong danh sách bars. Tôi đã thử nó theo nhiều cách, luôn luôn nhận được lỗi tương tự:

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

Một số trong những điều tôi đã cố gắng:

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

UPDATE:

Tôi đã làm bars với split nên nó là một mảng, không phải là một danh sách. Nó đã ném tôi đi vì Foo.findAllByBarInList(bars) trả về các đối tượng Foo của tôi chỉ tốt, chỉ khi tôi cố gắng thu thập các id đã thất bại. Bây giờ, tôi thực hiện bars với số tokenize và tất cả đều tốt.

+0

Tôi đã thêm thẻ groovy trở lại câu hỏi này bởi vì cả phương thức 'collect' và toán tử spread' * .' đều được định dạng bằng groovy. – ubiquibacon

+0

Bạn có chắc chắn danh sách bạn đang kiểm tra chống lại được thiết lập chính xác dưới dạng danh sách không? Sử dụng 'def ids = Foo.findAllByBarInList (bars) *. Id' làm việc cho tôi. – Kelly

+2

Tôi để thẻ Groovy tắt vì Grails sử dụng Groovy, vì vậy nó không cần thiết, và nó chỉ là việc sử dụng Groovy trong Grails, không phải là một câu hỏi cụ thể của Groovy. Một chuyên gia Groovy không có kinh nghiệm với Grails sẽ không thể giúp bạn. Tương tự, bạn có thể bỏ qua các thẻ Java, GORM, Hibernate, Spring, Programming;) –

Trả lời

12

đó làm việc cho tôi chừng nào bars là một danh sách

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

Nhưng nếu tất cả các bạn muốn là lĩnh vực id đó là một sự lãng phí để kéo toàn bộ trường lớp miền từ cơ sở dữ liệu. Bây giờ chỉ có một trường, nhưng trong thực tế nó có thể sẽ là một bảng lớn hơn. Vì vậy, tôi muốn sử dụng truy vấn HQL:

def ids = Foo.executeQuery(
    'select f.id from Foo f where f.bar in (:bars)', 
    [bars: bars]) 
Các vấn đề liên quan