【问题标题】:Avoid type safety warnings with Hibernate criteria query使用 Hibernate 条件查询避免类型安全警告
【发布时间】:2013-06-27 16:37:16
【问题描述】:
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());

【问题讨论】:

    标签: java hibernate generics


    【解决方案1】:

    好吧,你可以使用:

    @SuppressWarnings("unchecked")
    

    声明之前...

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

    【讨论】:

    • @EvertonAgner:我是通过问题的“删除警告”位来解决的。
    • 是的,我知道......我的意思是我们应该知道他是否想解决这个问题,或者他是否只是对警告有强迫症............就像我一样*大声笑
    • 如果您依赖于返回无类型集合的第 3 方 API,那么除了抑制警告之外,您无能为力。并添加注释解释为什么您可以保证集合的元素确实是正确的类型。
    • 顺便说一句,如果他有很多方法需要在上面放置注释,他可以将它放在 Class 声明中(它适用于它的任何成员)。
    【解决方案2】:

    在您的代码中

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

    您只需将参数的顺序颠倒到checkedList()

    顺便说一句,您可以静态导入该方法以使您的代码更简洁。 另外顺便说一句,我不知道checkedList() - 感谢您的提醒!

    编辑checkedList() 没有做你想做的事——如果我在回答之前好好考虑的话,我应该已经意识到了。

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

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

    【讨论】:

    • 我仍然收到警告......在颠倒参数后
    • 抱歉 - 看的不够仔细。将使用更好的信息编辑我的回复。
    【解决方案3】:

    对我来说,避免类型安全警告的最佳方法是 Matt Quail 在这篇文章中所说:How to avoid type safety warnings with Hibernate HQL results?,编写一个 cast-helper,但使用 Criteria 而不是 Query,如下所示:

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

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

    List<MyClass> myClassList = listAndCast(crit);
    

    您好!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-18
      • 2020-09-05
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多