22

我有一个带有以下变量的类 Shop

@Column(columnDefinition = "bit")
private boolean atShop;

使用此值,我使用 HSQL 从应用程序中检索此信息

from Person person
left join fetch person.shop

当我尝试调用此 HSQL 语句时,出现以下错误

org.springframework.orm.hibernate3.HibernateSystemException: could not set a field value by reflection setter of com.test.dataobject.Shop.atShop; nested exception is org.hibernate.PropertyAccessException: could not set a field value by reflection setter of com.test.dataobject.Shop.atShop

它抛出这个是因为它试图在 HSQL 中将布尔值设置为 null。private boolean atShop;我可以通过更改来解决这个问题,private Boolean atShop;但我想保留它,boolean因为我将它保存在我的数据库中

有没有办法在不改变的情况下解决这个boolean问题Boolean

编辑:

我知道布尔值只能是真/假并且布尔值可以设置为空,但是有没有办法让休眠/弹簧将此值设置为假(我认为它应该自动执行)而不是尝试将其设置为null 并抛出此异常?

我也尝试添加注释以自动将值设置为 false 但这也不起作用

@Column(nullable = false, columnDefinition = "bit default 0")
private boolean atShop;
4

6 回答 6

41

- boolean是一个原始类型,并且可以有 only 的值true or false

-鉴于Boolean是一个包装器对象并且可以被赋予一个值。

-提供了From Java 1.5 AutoBoxing,因此您可以使用简单赋值运算符( )将布尔值转换为布尔值并返回布尔值=,因此您可以在需要布尔值而不是布尔值的地方执行此操作。

于 2012-10-22T14:12:14.833 回答
10

而不是摆弄休眠代码,将您的表定义更改为默认空值到 false(或 0)。这样,当您从数据库中读取数据时,它将始终具有有效值(因为它是布尔值,所以更有意义)

于 2012-10-22T14:28:24.397 回答
4

null不一样false(也不一样true)。 null有非常具体的含义。这就是为什么 Hibernate 做它所做的事情......因为它确实是唯一有意义的事情,尽管你认为它应该做。

如果您想指示 Hibernate 将null这些列视为 false,唯一真正的解决方案是开发自定义 Hibernate 类型映射,用于“null 不是真正的 null”的这种特殊处理。您可以通过实现org.hibernate.type.Type接口或org.hibernate.usertype.UserType接口来实现这一点。你最好的办法是扩展标准的布尔类型映射并编织特殊的空处理。

然而,需要注意的一件事是查询,因为null在 ANSI SQL 中检查相等性永远不会有效。它解析为 SQL 调用的内容UNDEFINED,这通常意味着FALSE

于 2012-10-22T15:39:03.890 回答
1

boolean是原始的,它可以是trueorfalse并且默认是false. 要获取null,它的对象类型是Boolean

于 2012-10-22T14:13:41.377 回答
0

以为我会为此付出 2 美分,因为我遇到了类似的问题,但解决方案不同。

所以我的问题是它正在从数据库中检索数据并试图将这些数据保存回来。它为布尔字段检索的数据为空。因此,当它试图将其保存回来时,它抱怨它无法将 null 保存为布尔值。

修复是更新数据库数据,因此这些字段都没有空值。

于 2021-12-23T12:00:54.830 回答
-1

你知道你可以在它周围放一个try catch,如果它抛出一个异常,意味着它是空的,因此将它设置为false。

于 2013-12-04T15:03:23.120 回答