如何解决H2数据库“类型“BOOLEAN”和“INTEGER”的值不可比较”语法错误?

Pie*_*e C 11 hibernate h2

我有一个布尔类型的 H2 列,但 Hibernate 使用1/0而不是TRUE/FALSE值查询它,这会导致Values of types "BOOLEAN" and "INTEGER" are not comparable语法错误。

例如,Hibernate 5 会写

WHERE myBooleanColumn = 1
Run Code Online (Sandbox Code Playgroud)

代替

WHERE myBooleanColumn = TRUE
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

我的 H2 数据库版本是 2.0.206,我使用的是 Spring Boot 2.5.6。

Pie*_*e C 8

您可以创建一个类来重写 Hibenate 的Dialect toBooleanValueString方法:

package com.myCorp;

import org.hibernate.dialect.H2Dialect;

public class H2DialectExtended extends H2Dialect {

    @Override
    public String toBooleanValueString(boolean bool) {
        return bool ? "TRUE" : "FALSE";
    }

}
Run Code Online (Sandbox Code Playgroud)

并将其加载到 Spring Boot 测试中application-test.properties

spring.jpa.properties.hibernate.dialect=com.myCorp.H2DialectExtended
Run Code Online (Sandbox Code Playgroud)

这样,Hibernate 就会写:

spring.jpa.properties.hibernate.dialect=com.myCorp.H2DialectExtended
Run Code Online (Sandbox Code Playgroud)

代替

WHERE myBooleanColumn = TRUE
Run Code Online (Sandbox Code Playgroud)

这将解决问题,因为 myBooleanColumn 是 H2 布尔类型。


小智 6

这对我有用(如果您使用 Oracle 模式):

@TestConfiguration
public class H2WithOracleModeTestConfiguration {

    @Bean
    public DataSource h2DataSource() {
        EmbeddedDatabase embeddedDatabase = new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .setName(UUID.randomUUID() + ";Mode=Oracle;DEFAULT_NULL_ORDERING=HIGH")
                .build();
        Mode mode = Mode.getInstance("ORACLE");
        mode.limit = true;
        // Here is the trick
        mode.numericWithBooleanComparison = true;
        return embeddedDatabase;
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 Spring Boot 2.7.X 和 H2 2.1.214。