SQLErrorCodeSQLExceptionTranslator 使用以下的匹配规则

本文介绍了如何通过子类实现定制SQL错误代码翻译的过程。首先检查是否存在定制转换的子类实现,接着将SQLException的errorcode与错误代码集中的errorcode进行匹配。默认情况下错误代码集将从SQLErrorCodesFactory取得,并且会根据数据库metadata信息中的databasename进行映射。最后,使用fallback翻译器完成未匹配到的错误代码翻译。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先检查是否存在完成定制转换的子类实现。通常SQLErrorCodeSQLExceptionTranslator 这个类可以作为一个具体类使用,不需要进行定制,那么这个规则将不适用。

接着将SQLException 的error code 与错误代码集中的error code 进行匹配。默认情况下错误代码集将从SQLErrorCodesFactory 取得。错误代码集来自classpath 下的sql-error-codes.xml 文件,它们将与数据库metadata 信息中的database name 进行映射。

使用fallback 翻译器。SQLStateSQLExceptionTranslator 类是缺省的fallback 翻译器。
 

 

rk.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Unknown column 'read_type' in 'field list' ### The error may exist in com/ruoyi/operate/mapper/material/EcMaterialInfoMapper.java (best guess) ### The error may involve defaultParameterMap ### The error occurred while setting parameters ### SQL: SELECT id,name,type,is_classify,format,parent_id,parent_ids,sort_no,is_folder,auth_deadline,file_id,thumb_file_id,duration,description,create_by,create_by_name,create_time,update_by,update_by_name,update_time,del_flag,relation_num,source,read_type FROM ec_material_info WHERE del_flag=0 AND (parent_id IS NULL AND is_classify = ? AND id IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)) ORDER BY sort_no ASC ### Cause: java.sql.SQLSyntaxErrorException: Unknown column 'read_type' in 'field list' ; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column 'read_type' in 'field list' at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:239) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:88) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440) at com.sun.proxy.$Proxy158.selectList(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:223) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.jav
最新发布
07-05
<think>我们正在处理一个数据库查询错误:Unknown column 'read_type' in 'field list'。这个错误通常发生在以下情况: 1. 数据库表中不存在查询语句中引用的列名'read_type'。 2. 可能是SQL语句中拼写错误,或者实体类字段与数据库列名不一致(特别是使用了MyBatis时,映射关系可能不正确)。 根据引用[1]中提到的内容,MyBatis在执行查询时会根据MappedStatement获取SQL语句,然后执行。因此,我们需要检查: - 实体类中是否有`read_type`字段(或对应的Java属性) - 数据库表中是否有`read_type`列 - MyBatis的映射配置(XML或注解)是否正确 步骤: 1. 检查数据库表结构,确认是否存在`read_type`列。 2. 检查实体类(Entity)中是否有对应的属性,并且属性名是否与数据库列名匹配(注意:MyBatis默认使用驼峰命名转下划线,或者通过注解/XML映射)。 3. 检查MyBatis的Mapper文件(XML)或注解中,是否正确地映射了该字段。 4. 如果使用了MyBatis-Plus,还需要检查是否在实体类中使用了`@TableField`注解来指定数据库字段名。 另外,根据引用[2]中提到的MyBatis-Plus生成器的依赖,如果项目使用了MyBatis-Plus的代码生成器,那么生成的实体类应该与数据库表结构一致。因此,如果数据库表结构有变动(比如新增了`read_type`列),需要重新生成实体类。 解决方案: 1. 确认数据库表是否存在`read_type`列: - 可以直接在数据库中执行`DESC 表名;`查看表结构。 2. 如果数据库表没有该列,则需要添加该列(需要数据库操作权限): ```sql ALTER TABLE 表名 ADD COLUMN read_type 数据类型 [约束]; ``` 3. 如果数据库表有该列,检查实体类: - 确保实体类中有对应的属性,例如: ```java private Integer readType; // 或者使用String等合适的数据类型 ``` - 如果数据库列名为`read_type`,而实体类属性名为`readType`,则MyBatis的驼峰命名规则会自动转换(前提是配置了驼峰命名规则)。如果没有配置,则需要使用`@TableField`注解: ```java @TableField("read_type") private Integer readType; ``` 4. 检查Mapper文件或注解: - 在XML映射文件中,确保SQL语句中引用了正确的列名(即`read_type`),或者在注解SQL中正确书写。 - 例如,在XML中: ```xml <select id="selectList" resultType="com.example.entity.YourEntity"> SELECT id, ..., read_type FROM your_table </select> ``` - 或者使用注解: ```java @Select("SELECT id, ..., read_type FROM your_table") List<YourEntity> selectList(); ``` 5. 如果使用了MyBatis-Plus的代码生成器,并且数据库表结构已更新,则重新运行生成器以更新实体类和Mapper。 6. 检查MyBatis的配置:确保在application.properties或application.yml中开启了驼峰命名规则(如果使用): ```properties mybatis.configuration.map-underscore-to-camel-case=true ``` 7. 如果以上都正确,可能是缓存问题,尝试清理并重新启动应用。 相关问题: 1. 如何配置MyBatis的驼峰命名自动映射? 2. MyBatis-Plus代码生成器如何重新生成代码? 3. 如何动态添加数据库表的列?</think>### 解决 Spring Boot + MyBatis "Unknown column 'read_type' in field list" 错误 此错误表示 SQL 语句引用了不存在的数据库列 `read_type`。以下是系统排查步骤和解决方案: #### 1. **检查数据库表结构** - 执行 SQL 确认表结构: ```sql DESC 表名; -- 替换为实际表名 ``` - 验证是否存在 `read_type` 列: - **不存在**:需添加列(需数据库权限): ```sql ALTER TABLE 表名 ADD COLUMN read_type VARCHAR(50); -- 根据业务调整数据类型 ``` - **存在但拼写不同**:如 `readType`(驼峰命名),需调整 SQL 或映射配置 #### 2. **检查实体类映射** - 确保实体类字段与数据库列名匹配: ```java public class YourEntity { // 若数据库列名为 read_type private String readType; // 依赖驼峰命名转换 // 或显式指定列名(推荐) @TableField("read_type") // MyBatis-Plus 注解 private String readType; } ``` - **关键点**: - MyBatis 默认开启驼峰命名转换(`userName` → `user_name`) - 若列名包含特殊符号(如 `read_type`),需使用 `@TableField` 注解 #### 3. **检查 SQL 映射文件** - 在 XML 或注解 SQL 中验证列名引用: ```xml <!-- XML 示例 --> <select id="selectList" resultType="YourEntity"> SELECT id, read_type FROM your_table <!-- 确保列名正确 --> </select> ``` ```java // 注解示例 @Select("SELECT id, read_type FROM your_table") List<YourEntity> selectList(); ``` #### 4. **验证 MyBatis 配置** - 检查 `application.properties` 是否启用驼峰转换: ```properties mybatis.configuration.map-underscore-to-camel-case=true ``` - 若使用 MyBatis-Plus,添加配置: ```yaml mybatis-plus: configuration: map-underscore-to-camel-case: true ``` #### 5. **检查代码生成器配置** 根据引用[2],若使用 MyBatis-Plus 代码生成器: - 确认 `generatorConf.properties` 包含 `read_type` 列 - 重新生成实体类/Mapper: ```java AutoGenerator generator = new AutoGenerator(); generator.setGlobalConfig(config); // 包含表名和字段策略 generator.execute(); ``` #### 6. **排查 SQL 日志** - 开启 MyBatis SQL 日志(`application.properties`): ```properties logging.level.com.your.mapper=DEBUG ``` - 检查实际执行的 SQL 是否包含 `read_type` #### 常见修复方案 | 问题类型 | 解决方案 | |------------------|--------------------------------------------------------------------------| | 列未创建 | 执行 `ALTER TABLE` 添加缺失列 | | 实体类未映射 | 添加 `@TableField("read_type")` 或启用驼峰转换 | | SQL 语句拼写错误 | 修正 XML/注解中的 SQL 列名(如 `readType` → `read_type`) | | 缓存未更新 | 清理 MyBatis 缓存并重启应用 | > **重要提示**:修改后需同步数据库和代码。若使用 Flyway/Liquibase 管理数据库变更,需添加迁移脚本[^1]。 --- ### 相关问题 1. MyBatis 驼峰命名转换失效的可能原因有哪些? 2. 如何在 Spring Boot 中动态更新数据库表结构? 3. MyBatis-Plus 代码生成器如何配置字段映射策略? 4. 如何捕获并处理 MyBatis 的 SQL 执行异常?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值