在使用H2(1.3.168)作为本地数据库时,通过Java Hibernate执行某些查询时遇到了一个奇怪的问题。似乎Hibernate尝试执行一系列SELECT语句,但其中一个失败并出现模糊错误。
日志文件报告一些成功执行的SELECT语句只有一个参与表,例如SELECT ... FROM T1 WHERE ...;
但是,当它在语句中获得简单的LEFT OUTER JOIN语句时,会产生以下错误:
General error: "java.lang.NoClassDefFoundError: org/h2/table/TableFilter$2" [50000-168]
我采用了Hibernate报告的完全相同的查询,并尝试直接在H2控制台中执行它。同样的错误。
我用简单的JOIN替换了LEFT OUTER JOIN,同样的错误。我从JOIN中删除了第二个表,只从第一个表中选择SELECT,它就是SELECT。对于第二个表本身是否相同,没有问题,例如
SELECT * FROM T1;
尝试连接其他表的一堆...错误再次出现。
SELECT * FROM T1 t1 JOIN T2 t2 ON t1.pk_id = t2.fk_id;
有谁知道H2的问题是什么?
当应用程序在开始执行时(与Hibernate / Spring无关),问题在于drop-recreate脚本中缺少的一个序列对象。在H2中单独编写脚本,并将其与另一组创建/删除语句进行比较,以找出后者的工作,但不能找到前者。
很奇怪H2完全因此而崩溃,并且不会让JOIN
中的语句被执行而没有JOIN
的简单查询工作正常。