我们在尝试将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没有布尔数据类型,但它知道标准的TRUE
和FALSE
文本。