小编Jam*_*mes的帖子

当列名是关键字时h2+hibernate错误

我的生产使用 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?

谢谢。

h2

8
推荐指数
1
解决办法
3819
查看次数

为什么java编译器没有重写这段代码?

我正在测试这段代码:

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?在我看来,这两个比较应该在语义上是等价的,对吧?

java compiler-construction compiler-optimization

5
推荐指数
1
解决办法
109
查看次数