【问题标题】:javax.persistence.Query.getResultList() returning null listjavax.persistence.Query.getResultList() 返回空列表
【发布时间】:2015-10-27 00:13:07
【问题描述】:

我在我的 dao 中使用getResultList ( List javax.persistence.Query.getResultList() ) 来获取对象列表。知道为什么它可能会为在数据库中不匹配的查询返回 {null,null,null,null,null,null,null,null,null,null}。这导致我的代码列表。 hasNext() 打破之前工作正常。我有一段时间没有在这个项目中工作了(如果重要的话)。它正在使用

hibernate-core-4.1.9.Final-sources.jar

我看到this 并知道它现在正在返回列表。

  • 此更改从哪个版本开始生效?
  • hibernate 如何决定这个列表的大小?
  • 一般如何避免此类错误?

【问题讨论】:

  • 链接的帖子没有解释您所描述的结果。它说返回的列表是null,而不是返回null 元素的列表。由于您的结果似乎来自数据库中 10 个匹配项的查询(每个都是null),因此您必须提供一个MVCE 来帮助您找出发生了什么错了。
  • 思考10 我想我找到了解释(见下文) - 虽然我不知道你的意思 导致我的代码 List.hasNext() 中断这是早点工作正常

标签: java spring hibernate jpa oracle11g


【解决方案1】:

只是猜测:您在调试器中检查了您的列表,但没有查看 size 属性?在许多情况下,Hibernate 返回一个 ArrayList 而没有明确的 capacity。然后 ArrayList 用 10 个 null 元素初始化其内部数组(以避免在添加元素时一次又一次地创建数组)。但是如果你问list.iterator().hasNext(),它应该返回false(以及list.isEmpty()返回truelist.size()返回0)。

【讨论】:

    【解决方案2】:

    只需在结果列表中添加isEmpty 勾选即可:

    List<SomeType> resultList = query.getResultList();
    if (resultList.isEmpty()){
        //Handle it
    }
    

    结果列表总是包含一些空值,我后来使用了 isEmpty 检查来防止错误。

    【讨论】:

    • 来自 Tobias Liefke 的答案 list.iterator().hasNext() 应该返回 false 以及 list.isEmpty() 返回 true。所以基本上两者都应该做得很好。那么 isEmpty 将如何提供帮助呢?
    • isEmpty 可以快速检查是否应该进行任何迭代。您可以获取列表的迭代器并检查hasNext(),我承认它看起来更好,但是如果您可以在 isEmpty 检查之后循环遍历列表,为什么还要迭代呢?此外,当我发布这篇文章时,我还没有阅读评论,只是想帮助你,因为我在过去 3 周的工作中不得不使用 JPA 和 Hibernate,并且自己遇到了问题;)
    • @RBz 你能告诉我吗,如果我的猜测是对的?为什么你的迭代器break
    【解决方案3】:

    您可以通过检查 List.hasNext() 中的空元素来防止这种情况发生。

     if(variable = list.next() !=null)  
        // do something
    

    【讨论】:

    • 问题不是如何处理null 值,而是如何防止它们。
    【解决方案4】:
    • 至少版本 3.2.7
    • 为避免此类崩溃,请始终始终验证输入。无论您是从表单、数据库、文件还是任何类型的来源中提取它。验证您收到的内容是否符合您的预期,否则请丢弃/忽略它。

    【讨论】:

    • 在快速失败的系统中,您绝不应该忽略或丢弃与预期结构、语法或接口不匹配的数据。相反,您应该拒绝这样的输入并停止执行(在这种情况下最好有一个 NPE,而不是稍后引发的错误)。
    • 其实我就是这个意思,哈哈。我不是说你应该只丢弃输入的一部分,而是整个输入。如果不匹配,不要处理它(所以丢弃输入)。
    猜你喜欢
    • 2010-11-10
    • 2019-08-18
    • 2021-03-11
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多