我是Hibernate的新手,并且正在编写一个简单的方法来返回与特定过滤器匹配的对象列表。List<Foo>似乎是自然的回报类型。
List<Foo>
不管我做什么,除非聘用了丑陋的人,否则似乎都无法使编译器满意@SuppressWarnings。
@SuppressWarnings
import java.util.List; import org.hibernate.Query; import org.hibernate.Session; public class Foo { public Session acquireSession() { // All DB opening, connection etc. removed, // since the problem is in compilation, not at runtime. return null; } @SuppressWarnings("unchecked") /* <----- */ public List<Foo> activeObjects() { Session s = acquireSession(); Query q = s.createQuery("from foo where active"); return (List<Foo>) q.list(); } }
我想摆脱它SuppressWarnings。但是如果我这样做,我会得到警告
SuppressWarnings
Warning: Unchecked cast from List to List<Foo>
(我可以忽略它,但是我不想一开始就得到它),如果我删除泛型以符合.list()返回类型,则会收到警告
.list()
Warning: List is a raw type. References to generic type List<E> should be parameterized.
我注意到org.hibernate.mapping 确实 声明了List;但这是完全不同的类型- Query返回a java.util.List作为原始类型。我发现最近的Hibernate(4.0.x)无法实现参数化类型很奇怪,所以我怀疑是我自己在做错什么。
org.hibernate.mapping
List
Query
java.util.List
它看起来非常像将Hibernate结果转换为对象列表,但是在这里我没有“硬”错误(系统知道类型为Foo,并且我没有使用SQLQuery,而是使用了直接查询)。所以没有喜悦。
我也看过Hibernate Class CastException,因为它看起来很有希望,但是后来我意识到我实际上并 没有 得到任何Exception…我的问题只是一个警告的问题- 如果可以的话,是一种编码样式。
Exception
关于jboss.org的文档,Hibernate手册和一些教程似乎没有 如此 详细地涵盖该主题(或者我没有在正确的位置搜索?)。当他们确实进入细节时,他们会使用即时转换- 以及不在jboss.org官方网站上的教程中使用的转换,因此我有些警惕。
代码一旦编译,就不会 出现明显的 问题……我知道……。结果是预期的。
所以:我这样做对吗?我是否缺少明显的东西?有“正式”或“推荐”的 方式 吗?
简短的答案@SuppressWarnings是正确的方法。
长话大说,Hibernate List从该Query.list方法返回了一个原始数据,请参见此处。这不是Hibernate的错误,也不是可以解决的问题,查询返回的类型在编译时 未知 。
Query.list
因此,当你写
final List<MyObject> list = query.list();
您正在执行从List到的不安全转换List<MyObject>-无法避免。
List<MyObject>
您可能无法安全地执行转换,因为其中List 可能 包含任何内容。
使错误消失的唯一方法是更加丑陋
final List<MyObject> list = new LinkedList<>(); for(final Object o : query.list()) { list.add((MyObject)o); }