我的生产使用 MySQL 5.7,并运行 h2 (MODE=MySQL) 进行测试。我的连接字符串是这样的:
jdbc:h2:mem:ci_main;IGNORECASE=TRUE;MODE=MySQL;
Run Code Online (Sandbox Code Playgroud)
我使用 Hibernate 5.6.3 和 MySQL57InnoDBDialect。
它在 h2 版本 1.4.196 上运行良好。但最近,我尝试将 h2 升级到版本 2.0.204,SQL 语句开始失败。错误是 42001 抱怨列名称value,我认为这是一个关键字。似乎在这两个版本之间的某个时刻,h2 对 SQL 语法的限制比 MySQL 5.7 更加严格。
如果我编写 SQL 语句,我可以引用列名。但我正在使用 hibernate(它可以在 MySQL 5.7 上正常工作),并且我不想仅仅因为这个而更改列名。
有没有办法让h2更“兼容”MySQL 5.7?
谢谢。
我正在测试这段代码:
public class TestNull {
public void leftComparison(String s) {
if (s == null);
}
public void rightComparison(String s) {
if (null == s);
}
}
Run Code Online (Sandbox Code Playgroud)
我用javac 1.8.0_05编译它,然后检查字节码:
public class TestNull {
....
public void leftComparison(java.lang.String);
Code:
0: aload_1
1: ifnonnull 4
4: return
public void rightComparison(java.lang.String);
Code:
0: aconst_null
1: aload_1
2: if_acmpne 5
5: return
}
Run Code Online (Sandbox Code Playgroud)
显然,leftComparison编译是在推送和弹出2时在堆栈上推送和弹出1个变量rightComparison.我推测这样的leftComparison效率会稍微高于rightComparison?
我想知道为什么编译器不会重写代码rightComparison?在我看来,这两个比较应该在语义上是等价的,对吧?