【问题标题】:How to save a boolean in a bit(1) field如何在 bit(1) 字段中保存布尔值
【发布时间】:2020-02-19 16:06:28
【问题描述】:

我有一个代码可以读取和写入一个表,该表有一个 bit(1) 字段。当我阅读此表时,休眠将其转换为boolean 就好了,但是当我尝试保存到它时,它给了我column is type bit but expression is type boolean。我不能将此字段更改为boolean

到目前为止,我尝试将 @Type 与 hibernate 的 BooleanType 联系,但无济于事。

【问题讨论】:

  • 您的实体如何准确地声明此字段/列?通常@Column (name= "thecolumnsname") protected Boolean myBoolean; 就足够了。
  • 就是这样。当我从表中读取值时它可以工作,但只有在我尝试写入表时才会抛出这个。
  • 好吧,我听说 Hibernate 在映射布尔值和位时存在问题,但通常如果您可以 读取 bit(1)Boolean,那么您应该能够 Boolean 写入bit(1) - 特别是因为Java 中没有与bit 等效的内容。但是,您可以尝试不同的 JavaType(mabye byte 或 short)并查看您的数据库是否了解如何将 1 :: short 转换为 1 :: bit。如果这是可能的,那么您可以实现自己的converter
  • 你为什么使用 bit 来表示布尔值?该列应定义为boolean

标签: java postgresql hibernate


【解决方案1】:

你已经分配了 (byte) 0 / (byte) 1 。它将支持将布尔值转换为字节。并将字节转换为布尔值。

【讨论】:

    【解决方案2】:

    来自the documentation

    bit [ (n) ] 定长位串

    虽然在某些数据库(MySQL 和其他一些)bit(1) boolean,在 Postgres it's not。 Postgres 具有应该使用的 boolean 数据类型。

    【讨论】:

    • 由于无法在 postgresql 上更改为布尔值,如何在 java/hibernate 中表示位字符串?
    • 至少使用自定义UserType,但我会尽我所能在数据库中使用正确的数据类型。为什么不能改?
    • 好吧,我问过使用它的人,他们说有大量代码在使用它,如果他们更改了代码,他们将不得不更改。
    • 就像 12 岁的 C++ 代码一样,没人愿意正确维护它,它成长为如何不编写应用程序的绝妙示例。相信我,我无法改变数据库方面的任何东西:(
    • 实际上 MySQL 并没有将“位视为布尔值”。 MySQL 将所有内容都视为布尔值 - 如果一个值可以转换为大于 0 的数字值,则它被认为是“真”,否则为假。 1thing 被认为是true
    猜你喜欢
    • 2017-08-05
    • 2015-06-04
    • 1970-01-01
    • 2014-02-13
    • 2017-04-25
    • 2020-06-11
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多