无法在 H2 数据库中使用联接
Posted
技术标签:
【中文标题】无法在 H2 数据库中使用联接【英文标题】:Cannot Use Joins in H2 Database 【发布时间】:2019-02-26 03:23:59 【问题描述】:我在使用 H2 (1.3.168) 作为本地数据库时通过 Java Hibernate 执行某些查询时遇到了一个奇怪的问题。似乎 Hibernate 尝试执行一系列 SELECT 语句,但其中一个因模糊错误而失败。
日志文件报告说,一些成功执行的 SELECT 语句只有一个参与表,例如从 T1 中选择 ...;
但是,当它到达语句中的一个简单的 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 的问题是什么?
【问题讨论】:
代码是什么?通过谷歌搜索错误消息并在手册中找到它,您学到了什么? minimal reproducible example PS 你在混合,
& JOIN
和FROM
吗?
@philipxy 我没有包含代码,因为它似乎无关紧要,因为我什至无法在我的任何表上执行简单的JOIN
,即使它运行也会产生上述错误在 H2 控制台本身中。所以我推测问题不在于应用程序,而是 H2 有问题。正如我所说,我可以运行没有JOIN
的简单查询并检索应用程序插入的结果,但任何其他查询都会在 H2 控制台(Web 界面)中输出此错误。不,我无法在 Internet 上找到与此确切错误相关的任何内容。
【参考方案1】:
问题在于,当应用程序在开始时执行时,drop-recreate 脚本中缺少一个序列对象(与 Hibernate/Spring 无关)。在 H2 中分别运行脚本并将其与另一组创建/删除语句进行比较,以找出后者的工作原理,而不是前者。
很奇怪,H2 会因此而完全崩溃,并且不会让其中包含 JOIN
的语句被执行,而没有 JOIN
的简单查询可以正常工作。
【讨论】:
以上是关于无法在 H2 数据库中使用联接的主要内容,如果未能解决你的问题,请参考以下文章