2012-07-17 99 views
6

我有这样一个类:获取所有对象的ID列表中的

class Foo { 
    String bar 
} 

我试图让所有的Foo对象,其bar字符串是列表bars的ID。我已经尝试过多种方法,总是收到了同样的错误:

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 } 

UPDATE:

我正在barssplit如此它是一个数组,而不是一个列表。它把我扔了,因为Foo.findAllByBarInList(bars)返回我的Foo对象就好了,只有当我试图收集ID时才会失败。我现在使barstokenize,而一切都很好。

+0

我将groovy标记添加回此问题,因为'collect'方法和spread运算符'* .'都基于groovy。 – ubiquibacon 2012-07-17 18:54:06

+0

您确定您正在检查的列表是否正确设置为列表?使用'def ids = Foo.findAllByBarInList(bars)*。id'适用于我。 – Kelly 2012-07-17 18:56:50

+2

自从Grails使用Groovy以来,我不再使用Groovy标签,因此它不是必需的,它只是在Grails中使用Groovy,而不是Groovy特定的问题。没有Grails经验的Groovy专家无法为您提供帮助。同样,你可以省略Java,GORM,Hibernate,Spring,编程标签;) – 2012-07-17 18:58:45

回答

12

这对我来说,只要可以作为bars是一个List

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

但是如果你想要的是id场是从数据库中提取整个域类实例的浪费。现在只有一个领域,但实际上它可能会是一个更大的桌子。所以我会使用HQL查询: