MySQL和H2 2.x的布尔映射为BIT(1)的比较问题



我们在尝试将H2从1.4.200版本升级到2.1.214版本时遇到以下错误。

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Values of types "ROW(C1 BOOLEAN, C2 BIGINT)" and "ROW(C1 INTEGER, C2 INTEGER)" are not comparable;

相关SQL部分from account this_ where (this_.admin, this_.id) >= (0, 5) order by this_.admin asc, this_.id asc limit ?

请注意,参数0和5(实际上是整个WHERE,在"极限"部分之前(是使用criteria.addQueryHint()作为字符串添加的(我知道,这是一个角落的情况,添加无偏移的分页(

我读过很多关于类似问题的讨论,但似乎没有一个解决方案/解决方案适用于我们的案例。

我们使用H2只是为了自动化测试,在生产中我们使用MySQL。BIT是MySQL中布尔值的默认列类型Hibernate映射:

Hibernate中的MySQLDialect版本为5.6.0.Final,具有:registerColumnType( Types.BOOLEAN, "bit" ); // HHH-6935

我尝试在执行该语句之前添加以下代码,但没有帮助。

Mode mode = Mode.getInstance("MySQL"); mode.numericWithBooleanComparison = true;

我还尝试将registerColumnType(Types.BOOLEAN, "bit");registerColumnType(Types.BOOLEAN, "bit(1)");添加到H2CustomDialect中,并使用它来代替H2Dialect,但它们都没有帮助。

在生产中更改几个表的列类型,每个表都包含数亿条记录,这不是我考虑的问题。

我应该如何处理这个问题?我不想永远停留在1.4.200版本。

H2的新版本不允许在常规兼容模式下在BOOLEAN和数字数据类型之间进行任何比较操作,而不允许显式转换为可比较的数据类型。

在MySQL和其他一些兼容模式中,您可以比较BOOLEAN和相等(=(或不相等(<>(的数值,但仍然无法将它们与>>=<<=运算符进行比较。你对TRUE >= 2这样的东西到底有什么期望?是指1 >=2(FALSE(还是TRUE >= TRUE(TRUE(?

因为您自己添加>= (0, 5)部分,所以您可以简单地为H2和MySQL添加>= (FALSE, 5)。MySQL没有布尔数据类型,但它知道标准的TRUEFALSE文本。

最新更新