如何避免休眠 HQL 结果出现类型安全警告?

2022-08-31 09:43:01

例如,我有这样的查询:

Query q = sess.createQuery("from Cat cat");
List cats = q.list();

如果我尝试制作这样的东西,它会显示以下警告

Type safety: The expression of type List needs unchecked conversion to conform to List<Cat>


List<Cat> cats = q.list();

有没有办法避免它?


答案 1

正如建议的那样,在任何地方使用是一种很好的方法,尽管每次打电话时确实需要一些手指打字。@SuppressWarningsq.list()

我建议还有另外两种技术:

编写强制转换助手

只需将所有内容重构到一个位置:@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 中,转至“窗口>首选项>Java>编译器>错误/警告”,然后在“通用类型”下,选中复选框Ignore unavoidable generic type problems due to raw APIs

这将关闭对类似问题的不必要的警告,例如上述不可避免的问题。

一些评论:

  • 我选择传入而不是结果,因为这样这种“作弊”方法只能用于使用Hibernate作弊,而不能用于作弊任何一般。Queryq.list()List
  • 您可以为等添加类似的方法。.iterate()

答案 2

这个问题已经很久了,但我希望我的答案可能对像我这样的人有所帮助。

如果你看一下javax.persistence api文档,你会看到自.其中之一是 返回 .您可以像使用的那样使用,但有很小的差异,即所有操作现在都是类型安全的。Java Persistence 2.0createQuery(String, Class<T>)TypedQuery<T>TypedQueryQuery

因此,只需将代码更改为smth,如下所示:

Query q = sess.createQuery("from Cat cat", Cat.class);
List<Cat> cats = q.list();

一切准备就绪。


推荐