为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。 【DM版本】:dm8 【操作系统】: 【CPU】: 【问题描述】*: 不管是在数据库中存在表或者不存在表的情况下,使用update都报“无效的列名”。 MySQL中即使在没有表的情况下,使用update也是会把表建出来的。
这是因为达梦查询出来的是小写表名,匹配又转换成大写了,导致无法匹配。继承DmDialect自定义个Dialect,重写buildIdentifierHelper即可
/** * @param builder * @param dbMetaData * @return {@link IdentifierHelper} * @author 杨xx * @date 2024-08-13 16:46 * @des 无此定义 hibernate ddl-auto=auto将会导致无法匹配从而重复创建表 * 查询时表名称为小写, 匹配时 默认转换成大写 导致无法匹配;MIXED表示不处理 原样返回 */ @Override public IdentifierHelper buildIdentifierHelper(IdentifierHelperBuilder builder, DatabaseMetaData dbMetaData) throws SQLException { builder.applyIdentifierCasing(dbMetaData); builder.applyReservedWords(dbMetaData); builder.applyReservedWords(AnsiSqlKeywords.INSTANCE.sql2003()); builder.applyReservedWords(super.getKeywords()); builder.setNameQualifierSupport(getNameQualifierSupport()); builder.setUnquotedCaseStrategy(IdentifierCaseStrategy.MIXED); return builder.build(); }
以上,方便后来人找到答案,解决问题。
这是因为达梦查询出来的是小写表名,匹配又转换成大写了,导致无法匹配。继承DmDialect自定义个Dialect,重写buildIdentifierHelper即可
/** * @param builder * @param dbMetaData * @return {@link IdentifierHelper} * @author 杨xx * @date 2024-08-13 16:46 * @des 无此定义 hibernate ddl-auto=auto将会导致无法匹配从而重复创建表 * 查询时表名称为小写, 匹配时 默认转换成大写 导致无法匹配;MIXED表示不处理 原样返回 */ @Override public IdentifierHelper buildIdentifierHelper(IdentifierHelperBuilder builder, DatabaseMetaData dbMetaData) throws SQLException { builder.applyIdentifierCasing(dbMetaData); builder.applyReservedWords(dbMetaData); builder.applyReservedWords(AnsiSqlKeywords.INSTANCE.sql2003()); builder.applyReservedWords(super.getKeywords()); builder.setNameQualifierSupport(getNameQualifierSupport()); builder.setUnquotedCaseStrategy(IdentifierCaseStrategy.MIXED); return builder.build(); }
以上,方便后来人找到答案,解决问题。