Hibernate将NULL值粘贴到列表中

时间:2010-07-16 19:32:28

标签: java hibernate

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

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

Object
Object
NULL
Object

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

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

然后在每个PrinterGroup内部都有一个包含NULL值的过滤器列表。

虽然我可以绕过并找到每个实例,但是我们循环遍历此列表并添加NULL检查我觉得它是一个bandaid修复,并且必须有一种方法来告诉Hibernate不要拉空值。

编辑:

  • 我们正在使用Hibernate 3.2.2

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映射。

5 个答案:

答案 0 :(得分:17)

此集合是否映射为<list> (or other indexed collection) and <list-index>

  

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

我想在使用索引集合时,如果索引列中有空白(即它的值为0137 )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();

我认为你的财产被称为'过滤器'