我有一个布尔类型的 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。
您可以创建一个类来重写 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。
| 归档时间: |
|
| 查看次数: |
13911 次 |
| 最近记录: |