使用Hibernate条件查询避免类型安全警告

时间:2012-01-26 15:31:00

标签: java hibernate generics

final Criteria crit = session.createCriteria(MyClass.class);
final List<MyClass> myClassList = crit.list();

结果如下: 类型安全:List类型的表达式需要未经检查的转换以符合List

他们是一个删除警告的方法,因为我使用此错误:

final List<MyClass> myClassList = Collections.checkedList(MyClass.class, crit.list());

3 个答案:

答案 0 :(得分:6)

嗯,你可以使用:

@SuppressWarnings("unchecked")
声明之前

......

请注意,这只会抑制警告 - 它不会做任何事情来使代码更安全。在这种情况下,我个人对此感到高兴;我相信Hibernate会做正确的事。

答案 1 :(得分:4)

在您的代码中

final List<MyClass> myClassList 
    = Collections.checkedList(MyClass.class, crit.list());

你只需要将参数的顺序反转为checkedList()

顺便说一句,你可以静态导入方法,使你的代码更简洁。 顺便说一下,我不知道checkedList() - 感谢单挑!

编辑checkedList()没有做你想做的事 - 因为我应该意识到,如果我在回答之前考虑过它。

checkedList()将检查添加到列表中的任何元素的类型并立即失败。与普通列表相反,它允许您输入错误的类型,并且仅在检索时失败。在你的情况下它没有任何区别,因为你不打算自己插入项目(我猜)。

Jon Skeet的回答(@SuppressWarnings("unchecked"))是正确的。

答案 2 :(得分:1)

对我来说,避免类型安全警告的最佳方法是Matt Quail在这篇文章中说:How to avoid type safety warnings with Hibernate HQL results?,编写一个强制助手,但是使用Criteria而不是Query,就像这样:

@SuppressWarnings("unchecked")
public static <T> List<T> listAndCast(Criteria crit) {
  List<T> list = crit.list();
  return list;
}

只有你必须调用这个方法:

List<MyClass> myClassList = listAndCast(crit);

问候!