我继承了一些使用Hibernate的Java代码。使用此代码的一些人现在报告说他们在整个地方都获得了NullPointerExceptions。
我已经能够跟踪它了,发现当我们执行一个从数据库中提取对象列表的查询时,它有一个对象列表(从另一个表中提取)Hibernate似乎要离开列表中的孔(NULL值)。所以列表可能看起来像:
Object
Object
NULL
Object
我们用来从数据库中提取信息的代码是:
List<PrinterGroup> groups =
this.getSession().createQuery( "from PrinterGroup" ).list();
然后在每个PrinterGroup内部都有一个包含NULL值的过滤器列表。
虽然我可以绕过并找到每个实例,但是我们循环遍历此列表并添加NULL检查我觉得它是一个bandaid修复,并且必须有一种方法来告诉Hibernate不要拉空值。
编辑:
EDIT2:
因此数据库似乎令人困惑。 PrinterGroup - &gt;过滤关系是一对多的关系。所以PrinterGroups有一个过滤器列表。问题是,当数据库出来时,过滤器列表中包含空值(顺便说一下,数据库中没有空值),列表如上所示。
EDIT3:
这是PrinterGroup HBM中的映射relavant picese
<subclass name="PrinterGroup" discriminator-value="PG">
<list name="filters"
lazy="true"
table="PG_FILTER"
inverse="false"
cascade="all-delete-orphan">
<key>
<column name="PG_ID" not-null="false"/>
</key>
<index column="LISTPOSITION"/>
<one-to-many class="Filter"/>
</list>
Filter是一个非常基本的POJO映射。
答案 0 :(得分:17)
此集合是否映射为<list>
(or other indexed collection) and <list-index>
?
除了具有set和bag语义的集合映射之外,所有集合映射都需要集合表中的索引列。索引列是映射到数组索引或List索引或Map键的列。 ...数组或列表的索引始终为整数类型,并使用该元素进行映射。映射列包含顺序整数,默认情况下从零开始编号。
我想在使用索引集合时,如果索引列中有空白(即它的值为0
,1
,3
,7
)Hibernate会在结果List
填充预期位置的空元素。
答案 1 :(得分:2)
List<PrinterGroup> groups = this.getSession().createCriteria( PrinterGroup.class ).add(Restrictions.isNotNull("filters")).list();
答案 2 :(得分:1)
好的,所以PrinterGroup对象本身不是null,但它们对Filter类型的对象有空引用?或者对包含空过滤器的过滤器列表的非空引用?
显而易见的答案是,数据库包含PrinterGroup和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
如果过滤器可能为空,那么这就是你的要求。或者你可以使用NullObject习惯用法使“空过滤器”成为一个实际的对象,尽管这对Hibernate来说并不简单。
如果过滤器不可能为null,请修复数据,向多对多添加非空约束,并修复输入验证以防止添加更多空值。
答案 3 :(得分:0)
您应该进行空检查,或者您必须重新排序列表以摆脱空值。这很痛苦。
答案 4 :(得分:0)
如何使用HQL过滤掉空过滤器
List<PrinterGroup> groups =
this.getSession().createQuery( "Select pg from PrinterGroup pg where pg.filter is not null" ).list();
我认为你的财产被称为'过滤器'