dm.jdbc.driver.DMException: 第 1 行, 第 37 列[comment]附近出现错误: 语法分析出错

在使用国产数据库达梦时,将字段命名为'comment'会导致JPA查询报错,表现为语法分析错误。通过修改字段名为'comment_',问题得以解决。

最近使用国产数据库达梦,遇到一个大坑。
数据库有一个字段名称叫comment,sql是这样的:

CREATE TABLE "CFGC"."CFG_LABEL"
(
"ID" INT NOT NULL,
"COMMENT" VARCHAR(765),
"DEF" CHAR(21),
"NAME" VARCHAR(96) NOT NULL,
PRIMARY KEY("ID"))

可是在使用jpa的时候,查询报错:

2019-08-06 09:01:33.761 ERROR 5296 --- [nio-8001-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : 第 1 行, 第 37 列[comment]附近出现错误: 
语法分析出错
2019-08-06 09:01:33.786 ERROR 5296 --- [nio-8001-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [select label0_.id as id1_0_, label0_.comment as comment2_0_, label0_.def as def3_0_, label0_.name as name4_0_ from cfg_label label0_]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement] with root cause

dm.jdbc.driver.DMException: 第 1 行, 第 37 列[comment]附近出现错误: 
语法分析出错
	at dm.jdbc.driver.DBError.throwException(Unknown Source) ~[DmJdbcDriver18.jar:- 8.1.0.147 - Production]

大概的意思是列对不上,很奇怪,报了个comment的错误,于是把commen字段删除,发现查询就正常了!

后来为了适配我只能改了下字段的名称,comment改成comment_:

CREATE TABLE "CFGC"."CFG_LABEL"
(
"ID" INT NOT NULL,
"COMMENT_" VARCHAR(765),
"DEF" CHAR(21),
"NAME" VARCHAR(96) NOT NULL,
PRIMARY KEY("ID"))

发现查询也是正常的

### 问题分析 `dm.jdbc.driver.DMException` 错误提示“不是 GROUP BY 表达式”通常出现在使用 `GROUP BY` 子句时,查询中包含的非聚合未在 `GROUP BY` 中声明。根据引用[^2]中的 SQL 示例,可以发现其结构可能存在问题,尤其是在 `HAVING` 子句和 `GROUP BY` 的结合上。 以下是对该问题的专业解答: --- ### 解决方案 #### 1. 确保所有非聚合都在 `GROUP BY` 中 SQL 标准要求,当使用 `GROUP BY` 时,`SELECT` 子句中的每一要么是聚合函数(如 `COUNT()`、`SUM()` 等),要么必须显式地包含在 `GROUP BY` 表中。如果某些未满足此条件,则会引发类似 `dm.jdbc.driver.DMException` 的错误。 以引用为例: ```sql SELECT t1.person_id AS personId FROM PERSON2.person_dimission_info t1 GROUP BY t1.person_id HAVING COUNT(1) = 1 AND 1=1; ``` 上述查询中,`t1.person_id` 已经包含在 `GROUP BY` 中,因此理论上不会触发“不是 GROUP BY 表达式”的错误。但如果存在其他未出的,则需要检查并修正。 --- #### 2. 检查是否有隐式或计算表达式 如果查询中包含隐式的或计算表达式(例如 `CASE WHEN` 或者其他派生字段),这些字段也必须显式地包含在 `GROUP BY` 中。例如,引用[^3]中的示例: ```sql CASE WHEN oea.JOB_TYPE IS NULL THEN NULL ELSE '中国' END AS gradeOrg, CASE WHEN oea.JOB_TYPE IS NULL THEN NULL ELSE 'A' END AS gradeEn ``` 如果上述表达式作为查询结果的一部分,并且未包含在 `GROUP BY` 中,则会导致错误。解决方法是将这些表达式添加到 `GROUP BY` 中,或者将其转换为聚合函数。 --- #### 3. 使用 `ANY_VALUE()` 函数(适用于特定数据库) 对于某些支持扩展功能的数据库(如 MySQL 5.7+),可以使用 `ANY_VALUE()` 函数来避免强制要求所有非聚合都包含在 `GROUP BY` 中。但需要注意的是,这种方法可能会导致不确定的结果,因此不推荐用于生产环境。 修改后的示例: ```sql SELECT ANY_VALUE(t1.person_id) AS personId FROM PERSON2.person_dimission_info t1 GROUP BY t1.person_id HAVING COUNT(1) = 1 AND 1=1; ``` --- #### 4. 检查数据库驱动版本 确保使用的 DM 数据库驱动版本是最新的,因为旧版本可能存在对标准 SQL 支持不完善的缺陷。如果确认是驱动版本问题,建议升级到最新版本。 --- #### 5. 调整查询逻辑 如果问题仍然无法解决,可以尝试调整查询逻辑以避免复杂的 `GROUP BY` 和 `HAVING` 结合。例如,通过子查询的方式重新组织数据: ```sql SELECT person_id AS personId FROM ( SELECT person_id, COUNT(*) AS cnt FROM PERSON2.person_dimission_info GROUP BY person_id ) subquery WHERE cnt = 1; ``` --- ### 总结 通过上述方法可以有效解决 `dm.jdbc.driver.DMException` 错误。核心在于确保所有非聚合都包含在 `GROUP BY` 中,或者合理使用聚合函数替代。此外,还需注意数据库驱动版本的兼容性问题。 ---
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员青戈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值