1

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

这个简单的查询按预期工作。我得到了一个 ItemTags 列表,并且可以做 ItemTags 应该做的所有美妙的事情:

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

例如:

println(theTags1[0].tag.tag)

正如预期的那样给了我这个:

Pilgrim's Progress

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

例如以下

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'

我需要做什么才能获得可用的对象?谢谢!

4

2 回答 2

2

在休眠中,

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

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

你必须使用例如

(ItemTag) theTags2[0][0]

访问第一个 ItemTag 实例。

于 2009-07-07T19:58:50.273 回答
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")
于 2009-07-10T17:51:40.573 回答