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();
我假设你的财产被称为’过滤’
- 在Play Framework中使用SchemaExport
- Hibernate持续vs保存
- hibernate。 ClassicQueryTranslatorFactory与ASTQueryTranslatorFactory
- persistence.xml中的Sequence Generator
- 如何使用hibernate在spring boot中实现分页
- sessionfactory.openSession()和sessionfactory.openStatelessSession()之间的区别?
- hibernate的替代品
- 多用户数据源 – Spring + Hibernate
- “本地事务已经有1个非XA资源:无法添加更多资源”错误