【发布时间】:2022-07-30 02:33:50
【问题描述】:
我有一个布尔类型的 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,我使用的是 Spring Boot 2.5.6。
【问题讨论】:
-
我从来没有做过这样的事情。你的配置中有什么方言?与其破解方言,不如试试
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 -
嗨@Bohemian,当一列被定义为布尔值但Hibernate提供1/0值而不是真/假时,就会出现问题。 ,无论出于何种原因,H2 support group 上也报告了此问题。谢谢。
-
如果 H2 模式设置为
MySQL,则将 1/0 等同于 true/false 将是正确的行为。尝试将;MODE=PostgreSQL(或任何您的数据库-many are supported)添加到您的jdbc 连接url,即jdbc:h2:...;MODE=PostgreSQL。顺便说一句,你的 jdbc url 是是什么? -
真正的数据库是Oracle。数据源以编程方式初始化,因为我需要
mode.limit=truehack 才能在LIMIT子句上不出现语法错误:@Bean @Profile("test") public DataSource dataSource() { // Ref groups.google.com/g/h2-database/c/yxnv64Ak-u8/m/n-kqYV_yBQAJ org.h2.engine .Mode mode = org.h2.engine.Mode.getInstance("ORACLE"); mode.limit = true; DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("org.h2.Driver"); dataSource.setUrl("jdbc:h2:mem:vessaging;DB_CLOSE_DELAY=-1"); -
令人惊讶的是,恕我直言,Oracle 没有布尔数据类型。传统上,使用
char并存储Y和N值,但也经常使用存储1和0的numeric。听起来H2后来选择了那个。您的“布尔”列是什么数据类型?