将 tinyint 映射为布尔休眠

Posted

技术标签:

【中文标题】将 tinyint 映射为布尔休眠【英文标题】:Map a tinyint as boolean hibernate 【发布时间】:2011-12-23 17:56:37 【问题描述】:

我在 mysql 表 (TINYINT(1)) 中有一个 BOOLEAN 类型,我正在尝试将布尔字段映射到实体中,但这会产生异常:

org.hibernate.HibernateException: Wrong column type in maegul.users for column admin. Found: bit, expected: boolean

我将实体中的字段更改为字节并进行相应的更改,使其成为布尔值,我得到:

org.hibernate.HibernateException: Wrong column type in maegul.users for column admin. Found: bit, expected: tinyint

我尝试在字段上使用@Type 注释:

@Type(type = "org.hibernate.type.NumericBooleanType")

但我明白了:

org.hibernate.HibernateException: Wrong column type in maegul.users for column admin. Found: bit, expected: integer

【问题讨论】:

可能是一些有用的信息here。 @alvinbaena:下面有正确答案吗?? 我认为这是一个重复的问题,已在此处回答:***.com/questions/3383169/… 【参考方案1】:

从我在这里读到的:

org.hibernate.HibernateException:maegul.users 中列管理员的列类型错误。找到:位,预期:整数

Hibernate 似乎期待一个整数并且得到了一点。

这意味着您的注释现在是正确的:

@Type(type = "org.hibernate.type.NumericBooleanType")

但也许它已将您的数据库更新为设置为位而不是整数,因此出现错误。

如果你真的需要一个 TinyInt,你可以使用 @Type AND @Column,设置为 Integer,类型为 TinyInt:

@Column(columnDefinition = "TINYINT")
@Type(type = "org.hibernate.type.NumericBooleanType")
public boolean admin = true;

【讨论】:

我已经有一段时间没有问这个问题了,这个问题相关的项目早就丢失了。我真的不记得我是如何解决这个问题的,但鉴于有些人认为这个答案是合适的,我会接受它。 是的。我有同样的错误,但我的专栏是bit。我使用了这个解决方案,但在columnDefinition 中使用BIT 而不是TINYINT 并且它有效。【参考方案2】:

最好使用BIT(1) 而不是TINYINT(1)

@Column(nullable = false, columnDefinition = "BIT", length = 1)
private boolean flag = false;

【讨论】:

【参考方案3】:

您可以从方言中做到这一点,不需要在所有地方进行繁琐的 col 级别注释:

import org.hibernate.Hibernate;
import org.hibernate.dialect.PostgreSQLDialect;
import java.sql.Types;

public class PostgresCustomConversionDialect extends PostgreSQLDialect 

    public PostgresCustomConversionDialect() 
        super();
        this.registerColumnType( Types.BIT, "numeric(1, 0)" );
        this.registerColumnType( Types.BOOLEAN, "numeric(1, 0)" );
    

    public String toBooleanValueString(boolean bool) 
        return bool ? "1" : "0";
    


然后在-“hibernate.dialect”中使用这个自定义方言作为postgres方言

【讨论】:

【参考方案4】:

试试这个:

  <property name="isPaymentReceived" type="java.lang.Boolean">
  <column name="IS_PAYMENT_RECEIVED" sql-type="tinyint"/>
</property>

【讨论】:

【参考方案5】:

我能够通过将“transformedBitIsBoolean=true”添加到我的 MySQL 连接字符串来解决此问题。

看到这个问题:"Found: bit, expected: boolean" after Hibernate 4 upgrade

还有这个论坛帖子:https://hibernate.atlassian.net/browse/HHH-6935

【讨论】:

【参考方案6】:

将其映射为 int 并使用访问器 (isAdmin) 获取布尔值有什么问题。无论如何,我希望你掩盖了实际的类型。

【讨论】:

【参考方案7】:

将其映射为 org.hibernate.type.BooleanType 可能会起作用。

见http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/types.html#types-value-basic。

【讨论】:

不,仍然不工作给出了相同的异常,就好像它是一个没有注释的布尔值【参考方案8】:

我今天在使用 hibernate 时遇到了类似的情况,最后将 mysql 数据类型设为 tinyint(1) 并将 hibernate 类型声明为布尔值,它成功了

【讨论】:

【参考方案9】:

@Type 注解是休眠注解 要与 JPA 一起使用,可以使用 ColumnDefiniton 属性。

@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean isTrue;

【讨论】:

【参考方案10】:

试试这个。

将您的列定义为 bit(1)

CREATE TABLE test_table (bool_column BIT(1));

将实体属性定义为布尔值

像这样映射属性

@Column(name = "bool_column", columnDefinition = "BIT")
public boolean boolField;

我认为这种方式更简单,而且你坚持 jpa 标准。

我有这个使用 MySQL 和 Hibernate 5。

【讨论】:

以上是关于将 tinyint 映射为布尔休眠的主要内容,如果未能解决你的问题,请参考以下文章

JOOQ:根据长度将 tinyint 映射到布尔值

“将 Tiny 视为布尔值”和实体框架 4

为啥 MySQL 将布尔值解释为 TINYINT(1) 而不是 BIT(1)?

如何将 Postgresql 布尔值转换为 MySQL Tinyint?

处理将 MySQL 布尔类型从 tinyint 更改为 bit 的 liquibase 升级

在 Symfony 中使用 Doctrine 的 DBAL 检索布尔值