java - 无法在 H2 数据库中使用联接
问题描述
在使用 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的问题是什么?
解决方案
问题在于应用程序在开始执行时 drop-recreate 脚本中缺少的序列对象之一(与 Hibernate/Spring 无关)。在 H2 中分别运行脚本并将其与另一组创建/删除语句进行比较,以找出后者的工作原理,而不是前者。
非常奇怪的是,H2 完全因为这个而分崩离析,并且不会让JOIN
其中的语句在没有正常工作的简单查询时被执行JOIN
。
推荐阅读
- delphi - 应用程序在目标计算机上产生异常
- python - 在 Raspberry Pi 上通过 OpenCV 编写的视频未运行
- html - 如何正确设置 svg 图案大小?
- python - Python将列表值分别分配给新变量
- python - 给出某个星形直方图的函数
- sql - SQL case - else 条件即使在其他条件为真时也已访问
- python - pandas duplicated() 在一种情况下返回列值,在另一种情况下返回索引值
- matlab - 使用倒数矩阵算法编写 MATLAB 代码
- plc - 从 Codesys (ABB AC500 PLC) 访问 PLC 元数据
- javascript - 无法通过 javascript CSS 重置按钮颜色