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

ni65a41a  于 2023-01-13  发布在  其他
关注(0)|答案(5)|浏览(174)

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

WHERE myBooleanColumn = 1

代替

WHERE myBooleanColumn = TRUE

如何解决这个问题?
我的H2数据库版本是2.0.206,我使用的是Sping Boot 2.5.6。

piah890a

piah890a1#

您可以创建一个类来覆盖Hibenate的DialecttoBooleanValueString方法:

package com.myCorp;

import org.hibernate.dialect.H2Dialect;

public class H2DialectExtended extends H2Dialect {

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

}

并将其加载到您的Sping Boot 测试application-test.properties中:

spring.jpa.properties.hibernate.dialect=com.myCorp.H2DialectExtended

这样,Hibernate将写入:

WHERE myBooleanColumn = TRUE

代替

WHERE myBooleanColumn =  1

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

q3qa4bjr

q3qa4bjr2#

这对我很有效(如果您使用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;
    }
}

我使用的是Sping Boot 2.7.X和H2 2.1.214。

8ulbf1ek

8ulbf1ek3#

我知道这是一个老问题,但我遇到了同样的问题,并以不同的方式解决了它,所以我在这里陈述我的解决方案,如果有人在未来遇到这个问题。
它是基于波希米亚人的评论(我试图引用你,但我找不到一个方法,对不起。
他建议修改JDBC字符串中的连接方式,我的连接字符串是:spring.datasource.url: jdbc:h2:mem:testdb;NON_KEYWORDS=USER;(我有一个表“user”,所以我需要禁用H2的关键字检查“user”)。
我必须特别添加数据库模式“MODE=MySQL”,以便它与我的布尔字段一起工作。
这将生成最终的连接字符串:spring.datasource.url: jdbc:h2:mem:testdb;NON_KEYWORDS=USER;MODE=MySQL

p3rjfoxz

p3rjfoxz4#

如果在类型匹配中出现错误,可以使用MODE=....在spring.datasource.url=jdbc:h2:mem:test;MODE=MySQL中指定它。但是由于某种原因,当我指定MODE=PostgreSQL时,它并没有解决我的问题。spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
而且类型匹配中的错误也消失了。

efzxgjgh

efzxgjgh5#

配置以下属性:

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

或者如果你使用yaml:

spring:
  datasource:
    url: jdbc:h2:mem:mydb
    username: sa
    password: password
    driverClassName: org.h2.Driver
  jpa:
    spring.jpa.database-platform: org.hibernate.dialect.H2Dialect

考虑升级到latest version of spring-boot(当前为2.6.2)。

相关问题