findAll()不返回正确的对象类型

时间:2009-07-07 18:16:15

标签: hibernate grails hql gorm findall

ItemTag对象包含Item对象和Tag对象。 (这些是Java域对象。)

这个简单的查询按预期工作。我找回了ItemTags列表,可以完成ItemTags应该做的所有精彩事情:

def theTags1 = ItemTag.findAll("from ItemTag  b")

例如:

println(theTags1[0].tag.tag)

按预期给我这个:

Pilgrim's Progress

但是,只要我在标准中添加另一个表,而不是获取ItemTags列表,我就会得到一个通用对象列表。

例如以下

def theTags2 = ItemTag.findAll("from ItemTag  b, Tag a where b.tag= a")

theTags2.each {
     theClass = it.getClass();
     nameOfClass = theClass.getName();
     println(nameOfClass)
}   

返回

[Ljava.lang.Object;
[Ljava.lang.Object;
[Ljava.lang.Object;

我根本无法使用生成的对象。例如:

println(theTags2[0].tag.tag)

给了我这个错误:

Exception evaluating property 'tag' for java.util.ArrayList, Reason: groovy.lang.MissingPropertyException: No such property: tag for class: java.lang.String

def exTag2 = (ItemTag) theTags2[0]

给了我这个错误:

Cannot cast object '[Ljava.lang.Object;@2d81f' with class '[Ljava.lang.Object;' to class 'org.maflt.flashlit.pojo.ItemTag'

获取可用对象需要做什么?谢谢!

2 个答案:

答案 0 :(得分:2)

在Hibernate中,

  

"from ItemTag b, Tag a where b.tag= a"

查询是交叉连接。此查询的结果是一个Object数组列表,其中第一个项是ItemTag实例,第二个项是Tag实例。

你必须使用例如

  

(ItemTag) theTags2[0][0]

访问第一个ItemTag实例。

答案 1 :(得分:1)

假设您只是想获取ItemTag对象,您还可以将HQL更改为:

def theTags2 = ItemTag.findAll("select b from ItemTag  b, Tag a where b.tag= a")

告诉你只需要一个物体。 您还应该能够使用我认为类似的连接条件:

def theTags2 = ItemTag.findAll("from ItemTag b where b.tag is not null")