将 tinyint 映射为布尔类型 Hibernate

34

我在MySQL表中有一个BOOLEAN类型的字段(TINYINT(1)),我试图映射实体中的布尔字段,但这会生成一个异常:

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

我把实体中的字段改成了byte类型,并做出相应的更改,使其作为布尔值运行,但是我收到了如下错误信息:

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

这里可能有一些有用的信息:https://hibernate.onjira.com/browse/HHH-468。 - jtahlborn
2
@alvinbaena:下面有任何正确的答案吗? - Adriano
我认为这是一个重复的问题,已经在这里得到了回答:https://dev59.com/eHA75IYBdhLWcg3wRW2c#10224905 - Donatello
10个回答

42

从我在这里阅读的内容:

org.hibernate.HibernateException:maegul.users的列admin中的列类型错误。找到:bit,期望:integer

看起来Hibernate希望得到一个整数,但是却得到了一个比特。

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

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

但也许它已经更新了你的数据库,将其设置为位(Bit)而不是整数(integer),因此出现了错误。

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

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

3
自从我提出这个问题以来已经有一段时间了,而且涉及到这个问题的项目早已失去了。我真的不记得我是怎么解决的,但由于有些人发现这个答案是合适的,我会接受它。 - Alvin Baena
1
是的。我也遇到了同样的错误,但我的列是一个 bit。我使用了这个解决方案,但在 columnDefinition 中使用了 BIT 而不是 TINYINT,它起作用了。 - nonzaprej

8

建议使用BIT(1)而不是TINYINT(1)

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

5
您可以使用方言来完成这个操作,而不需要在所有地方都进行繁琐的列级注释:
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方言。


2

试试这个:

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

1

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

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

1

0
今天我在使用Hibernate时遇到了类似的情况,最终将MySQL数据类型设置为tinyint(1),并将Hibernate类型声明为布尔类型,问题得以解决。

0

将其映射为int并使用访问器(isAdmin)获取布尔值有什么问题?我希望您无论如何都会隐藏实际类型。


0

不行,仍然不起作用,会给出与未注释的布尔值相同的异常。 - Alvin Baena

-1

试试这个。

将您的列定义为bit(1)

CREATE TABLE test_table (bool_column BIT(1));

将实体属性定义为布尔值

像这样映射属性

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

我认为这种方式更简单,而且你还遵循了JPA标准。

我已经在MySQL和Hibernate 5上实现了这个功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接