带有Lists的Hibernate类强制转换异常

时间:2014-01-22 08:19:13

标签: java hibernate list generics

所以我有这段代码:

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怎么可能举行foo?

有关课程的一些信息:

所有类都是实体,db有表格。

Foo类有一个字段ID和描述。

FooRequirement类是一个ABSTRACT类,它引用了Foo(ManyToOne)和id。 FooRequirement不会扩展Foo。

FooBarRequirement类扩展了一个FooRequirement类,如果它是相关的。它有一个字段Baz。 (多对一)

我希望问题很清楚。实际上情况有点复杂但我尽量让它尽可能简单。

1 个答案:

答案 0 :(得分:2)

您正在查询select distinct fr.foo...

中明确选择Foo对象

所以这是最终在List

中的类型

编辑:您已将要包含的列表定义为List<FooRequirement>。但是,您从Session获得的结果列表未输入,因此可以在您的实例中保留任何Object - Foo

由于您无法从休眠TypedQuery获取Session,因此您可以考虑使用EntityManager interface