Hibernate将NULL值粘贴到列表中

我inheritance了一些使用Hibernate的Java代码。 使用此代码的一些人现在报告说他们在整个地方都获得了NullPointerExceptions。

我已经能够跟踪它了,发现当我们执行一个从数据库中提取对象列表的查询时,它有一个对象列表(从另一个表中提取)Hibernate似乎在list(NULL值)。 所以列表可能看起来像:

Object Object NULL Object 

我们用来从数据库中提取信息的代码是:

 List groups = this.getSession().createQuery( "from PrinterGroup" ).list(); 

然后在每个PrinterGroup内部是一个包含NULL值的filter列表。

虽然我可以四处寻找每一个实例,然后我们遍历这个列表并添加一个NULL检查我觉得它是一个bandaid修复,并且必须有一种方法告诉Hibernate不要拉空值。

编辑:

  • 我们正在使用Hibernate 3.2.2

EDIT2:

因此数据库似乎令人困惑。 PrinterGroup – > Filter关系是一对多关系。 所以PrinterGroups有一个filter列表。 问题是,当数据库出来时,filter列表中包含空值(顺便说一下,数据库中没有空值),列表如上所示。

EDIT3:

这是PrinterGroup HBM中的映射relavant picese

         

Filter是一个非常基本的POJO映射。

此集合是否使用 (或其他索引集合)和映射?

除了具有set和bag语义的集合映射之外,所有集合映射都需要集合表中的索引列。 索引列是映射到数组索引或List索引或Map键的列。 …数组或列表的索引始终为整数类型,并使用该元素进行映射。 映射列包含顺序整数,默认情况下从零开始编号。

我想,当使用索引集合时,如果你的索引列中有空隙(即它有0,1,3,7等值),Hibernate会在预期的位置用空元素填充结果List

 List groups = this.getSession().createCriteria( PrinterGroup.class ).add(Restrictions.isNotNull("filters")).list(); 

好吧,所以PrinterGroup对象本身不是null,但它们对Filter类型的对象有空引用? 或者对包含空filter的filter列表的非空引用?

显而易见的答案是,数据库包含PrinterGroup和Filter之间的多对多关系,并且具有filter的数据库空值,例如:

  select * from printer_group_filter; id printergroup_id filter_id 1 1 1 2 1 null 3 1 2 4 2 1 5 2 null 

如果filter可能为空,那么这就是你的要求。 或者你可以使用NullObject习惯用法使“空filter”成为一个实际的对象,尽管这对于Hibernate来说并不是那么简单。

如果filter不可能为null,请修复数据,向多对多添加非空约束,并修复输入validation以防止添加更多空值。

你应该进行空检查,或者你必须重新排序列表以摆脱空值。 这很痛苦。

如何使用HQL过滤掉空filter

 List groups = this.getSession().createQuery( "Select pg from PrinterGroup pg where pg.filter is not null" ).list(); 

我假设你的财产被称为’过滤’