Отобразить tinyint как булевский спящий режим

У меня есть тип BOOLEAN в таблице MySQL (TINYINT (1)), и я пытаюсь отобразить логическое поле в сущности, но это порождает исключение:

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

Ответ 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;

Ответ 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";
    }

}

Затем используйте этот пользовательский диалект в качестве диалекта postgres в - "hibernate.dialect"

Ответ 4

Попробуй это:

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

Ответ 6

Что неправильно с отображением его как int и использованием accessor (isAdmin), чтобы получить логическое значение. Надеюсь, вы все равно скрываете фактический тип.

Ответ 8

Сегодня я столкнулся с подобной ситуацией с hibernate и в итоге получил тип данных mysql как tinyint (1) и объявил тип спящего режима как логический, и он сделал трюк

Ответ 9

Аннотация @Type представляет собой аннотацию hibernate для использования с JPA, можно использовать атрибут ColumnDefiniton.

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