Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回空列表的javax.persistence.Query.getResultList()_Java_Spring_Hibernate_Jpa_Oracle11g - Fatal编程技术网

返回空列表的javax.persistence.Query.getResultList()

返回空列表的javax.persistence.Query.getResultList(),java,spring,hibernate,jpa,oracle11g,Java,Spring,Hibernate,Jpa,Oracle11g,我在dao中使用getResultList javax.persistence.Query.getResultList获取对象列表。知道为什么它可以为数据库中不匹配的查询返回{null,null,null,null,null,null,null,null}吗。这导致了我的代码列表。有下一个破发,它在早些时候工作得很好。如果有关系的话,我已经有一段时间没有参与这个项目了。它正在使用 hibernate-core-4.1.9.Final-sources.jar 我看到并理解它现在正在返回列表 此更改

我在dao中使用getResultList javax.persistence.Query.getResultList获取对象列表。知道为什么它可以为数据库中不匹配的查询返回{null,null,null,null,null,null,null,null}吗。这导致了我的代码列表。有下一个破发,它在早些时候工作得很好。如果有关系的话,我已经有一段时间没有参与这个项目了。它正在使用

hibernate-core-4.1.9.Final-sources.jar

我看到并理解它现在正在返回列表

此更改从哪个版本开始生效? hibernate如何决定此列表的大小? 一般来说,如何避免这种错误?
您可以通过检查List.hasNext中的null元素来防止这种情况

 if(variable = list.next() !=null)  
    // do something
至少版本3.2.7 为避免此类崩溃,请始终验证输入。无论您是从表单、数据库、文件还是任何类型的源中提取它。确认您收到的是您期望的内容,否则放弃/忽略它。 只需在结果列表中添加一个isEmpty检查:

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

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

只是猜测:您在调试器中检查了列表,但没有查看size属性?Hibernate在许多情况下返回没有显式容量的ArrayList。ArrayList使用10个空元素初始化其内部数组,以避免在添加元素时一次又一次地创建数组。但是如果您询问list.iterator.hasNext,它应该返回false,list.isEmpty返回true,list.size返回0。

链接的帖子没有解释您描述的结果。它表示返回的列表为null,而不是返回null元素的列表。由于您的结果似乎来自一个查询,该查询在数据库中有10个匹配项,每个匹配项都为空,您必须提供一个帮助您找出问题所在。考虑到10,我想我找到了下面的解释-虽然我不知道导致我的代码列表的原因是什么。hasNext to break早期运行良好问题不是如何处理空值,但是如何防止它们。在一个快速失效的系统中,你永远不应该忽略或丢弃与预期结构、语法或接口不匹配的数据。相反,你应该拒绝这样的输入并停止执行。在这种情况下,最好有一个NPE,而不是以后出现的错误。这正是我要说的,哈哈。我不是说你应该只丢弃部分输入,而是整个输入。如果不匹配,不要处理它,因此丢弃输入。从Tobias Liefke answer list.iterator.hasNext应返回false以及list.isEmpty返回true。所以基本上两者都可以。那么isEmpty将如何帮助呢?isEmpty是一个快速检查,以查看是否应该进行任何迭代。你可以使用列表的迭代器,然后检查hasNext,见鬼,我承认它看起来更漂亮,不过如果你能在isEmpty检查之后循环列表,为什么还要进行迭代呢?另外,在我发布这篇文章的时候,我还没有读到评论,只是想帮助你,因为在过去的3周里,我不得不与JPA和Hibernate一起工作,我自己也遇到了这个问题@如果我猜对了,你能告诉我比吗?为什么你的迭代器坏了?