2014-01-22 14 views
0

所以我有這樣的代碼:休眠類轉換異常使用列表

public List<FooRequirement> findByFoo(Foo foo) { 
    return getCurrentSession().createQuery("select distinct fr.foo from FooBarRequirement fr where fr.Foo.id = :FooId") 
      .setParameter("FooId", foo.getId()).list(); 
} 

我的地方把這個代碼在我的代碼以

List<FooRequirement> myList = dao.findByFoo(foo); 

然後我得到一個ClassCastException,不知道我在做什麼錯。我調試了我的代碼,並且我看到我的列表(myList)應該保存FooRequirement類型的引用實際上是用Foo類型的引用填充的。

然後我發現我的錯誤:

return getCurrentSession().createQuery("select distinct fr from FooBarRequirement fr where fr.Foo.id = :FooId" 

有一個「選擇不同的fr.foo」,但它應該是一個「選擇不同的FR ......」因爲我想一個列表的FooRequirements而不是Foos。

我的問題是,這個參考文獻是如何首先進入List的?我的意思是一個List如何能夠擁有一個foo?

有關類的一些信息:

所有的類都是實體,該數據庫已經爲他們的表。

Foo類有一個字段ID和一個描述。

FooRequirement類是一個ABSTRACT類,並且具有對Foo(ManyToOne)和id的引用。 FooRequirement不會擴展Foo。

FooBarRequirement類擴展了FooRequirement類,如果它是re​​lavent。它有一個場Baz。 (ManyToOne)

我希望問題很清楚。事實上情況有點複雜,但我儘可能地簡化了它。

+1

嗯,我不明白你的問題。 「我的意思是一個名單如何可能擁有一個富人?」 - 你究竟是什麼意思?爲什麼不能'List'持有'foo'? –

+0

這是FooRequirements的列表。而Foo不會擴展FooRequirement。 –

+0

你確定它不是'List '?從看你的代碼,這就是Hibernate應該做的。而且,這也不能轉換爲List 。 –

回答

2

你被明確選擇美孚對象在查詢select distinct fr.foo...

因此,這是在你的List結束的類型。

編輯:你已經定義了你想要的列表爲List<FooRequirement>。然而,從Session得到的結果列表沒有輸入,因此可以容納任何Object,在您的實例中 - Foo

由於您無法從休眠模式Session獲得TypedQuery,因此您可以考慮使用EntityManager interface

+0

這個列表只允許持有FooRequirement對象嗎? –

+0

不,您嘗試返回的結果列表有此限制,但不包含會話的結果列表。 – kostja