我有以下Hibernate代码:
List<Book> result;
result = hibernateTemplate.execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Query query = session.createQuery("SELECT DISTINCT b FROM Book as b LEFT JOIN FETCH b.authors");
List list = query.list();
return list;
}
});
我从hibernateTemplate.execute(...
开始收到以下警告:
Multiple markers at this line
- HibernateCallback is a raw type. References to generic type HibernateCallback<T> should be parameterized
- Type safety: The expression of type new HibernateCallback(){} needs unchecked conversion to conform to HibernateCallback<Object>
- Type safety: Unchecked invocation execute(new HibernateCallback(){}) of the generic method execute(HibernateCallback<T>) of type
HibernateTemplate
- Type safety: The expression of type new HibernateCallback(){} needs unchecked conversion to conform to HibernateCallback<List<Book>>
- Type safety: The expression of type List needs unchecked conversion to conform to List<Book>
所以这真的很难。
请你解释一下
编译器看到了什么与期望的内容,为什么?
修复这些警告的最安全方法是什么......即不是@SuppressWarnings("unchecked")
?
我已尝试过以下链接中显示的提案: https://forums.oracle.com/forums/thread.jspa?threadID=1182661 (出现在页面底部的三个建议中的第二个建议)....但是它没有用。
谢谢!
P.S。我知道如何解决由于List list = query.list();
而应该得到的其他警告,这就是为什么我在我的问题中没有提到它。
P.S-2根据Eclipse,该方法的签名是<Object> Object org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateCallback<Object> action) throws DataAccessException
答案 0 :(得分:2)
该类的签名是HibernateCallback<T>
并定义了一个方法T doInHibernate(Session)
但你没有提供类型参数T
- 这就是编译器所抱怨的:它不确定您的代码实际上导致List<Book>
符合您的result
变量。
你是正确的,添加@SuppressWarnings
不是一个好主意(它不会增加实际的类型安全性),请尝试这样做:
List<Book> result = hibernateTemplate.execute(new HibernateCallback<List<Book>>() {
public List<Book> doInHibernate(Session session) throws HibernateException, SQLException {
Query query = session.createQuery("SELECT DISTINCT b FROM Book as b LEFT JOIN FETCH b.authors");
List list = query.list();
return list;
}
});
这会将类型参数T
设置为预期的结果类型List<Book>
,特别是这意味着:
new HibernateCallback<List<Book>>()
而非new HibernateCallback()
public Object doInHibernate(Session ...
成为public List<Book> doInHibernate(Session ...
这仍然留下了未参数化的List list = query.list();
,你可以用How to avoid type safety warnings with Hibernate HQL results?中描述的方式之一来处理(我个人更喜欢那里提到的强制助手方法)。
答案 1 :(得分:0)
不只是......
new HibernateCallback<List>()...
这可能意味着方法返回类型将是List而不是Object。虽然那时你还需要指定List类型吗?