问题
例如,我有这样的查询:
Query q = sess.createQuery("from Cat cat");
List cats = q.list();
如果我尝试做这样的事情,它将显示警告"类型安全:类型列表的表达式需要未经检查的转换以符合列表":
List<Cat> cats = q.list();
有没有办法避免它?
#1 热门回答(94 赞)
正如建议的那样,使用@SuppressWarnings
是一个很好的方法,虽然它每次调用q.list()
时都会涉及一些手指输入。
我建议还有其他三种技巧:Collections.checkedList()
用这个替换你的作业:
List<Cat> cats = Collections.checkedList(q.list(), Cat.class);
你可能需要查看javadoc for that method,特别是关于equals
和hashCode
。
写一个cast-helper
只需将你所有的@SuppressWarnings
重构为一个地方:
List<Cat> cats = MyHibernateUtils.listAndCast(q);
...
public static <T> List<T> listAndCast(Query q) {
@SuppressWarnings("unchecked")
List list = q.list();
return list;
}
防止Eclipse为不可避免的问题生成警告
在Eclipse中,转到Window> Preferences> Java> Compiler> Errors / Warnings,在Generic type下,选中复选框Ignore unavoidable generic type problems due to raw APIs
这将关闭类似问题的不必要警告,例如上述不可避免的问题。
一些评论:
- 我选择传入Query而不是q.list()的结果,因为这种"作弊"方法只能用于欺骗Hibernate,而不是用于欺骗任何List。
- 你可以为.iterate()等添加类似的方法。
#2 热门回答(22 赞)
问题问题已经有很长一段时间了,但我希望我的回答可能会对像我这样的人有所帮助。
如果你看看javax.persistenceapi docs,你会看到自199888032以来已经添加了一些新的方法。其中一个是createQuery(String, Class<T>)
,返回TypedQuery<T>
。你可以像使用Query
一样使用TypedQuery
,因为现在所有操作都是类型安全的小差别。
所以,只需将代码更改为smth,如下所示:
Query q = sess.createQuery("from Cat cat", Cat.class);
List<Cat> cats = q.list();
你们都准备好了。
#3 热门回答(21 赞)
我们很好地使用@SuppressWarnings("unchecked")
,但我们通常只尝试在变量的声明上使用它,而不是整个方法:
public List<Cat> findAll() {
Query q = sess.createQuery("from Cat cat");
@SuppressWarnings("unchecked")
List<Cat> cats = q.list();
return cats;
}