Files
hzdyjs/docs/问题解决方案/学生考核自评得分查询字段错误修复报告.md
T
2025-08-21 16:24:34 +08:00

5.4 KiB

学生考核自评得分查询字段错误修复报告

问题描述

错误时间: 2025-08-21 11:53:24
错误接口: /assessment/approval/1958361581653856257
错误类型: SQL语法错误 - 未知字段

错误详情

org.springframework.jdbc.BadSqlGrammarException: 
Unknown column 'i.indicator_description' in 'field list'

错误SQL

SELECT s.id, s.application_id, s.indicator_id, s.indicator_name, 
       i.indicator_code, i.indicator_description, s.indicator_type, 
       s.max_score, s.self_score, s.self_remark, s.teacher_score, 
       s.teacher_remark, s.create_by, s.create_time, s.update_by, s.update_time 
FROM xskh_assessment_self_score s 
LEFT JOIN xskh_assessment_indicator i ON s.indicator_id = i.id AND i.tenant_id = '000000' 
WHERE s.application_id = ? AND s.deleted = 0 AND s.tenant_id = '000000' 
ORDER BY s.create_time ASC

问题分析

根本原因

  1. 字段名不匹配: SQL查询中使用了 i.indicator_description,但数据库表中实际字段名为 description
  2. 数据库表结构: xskh_assessment_indicator 表中的字段名是 description,不是 indicator_description

数据库表结构确认

-- xskh_assessment_indicator 表结构
CREATE TABLE `xskh_assessment_indicator` (
  `id` bigint(20) NOT NULL COMMENT '主键ID',
  `indicator_code` varchar(50) NOT NULL COMMENT '指标编码',
  `indicator_name` varchar(100) NOT NULL COMMENT '指标名称',
  `indicator_type_id` bigint(20) NOT NULL COMMENT '指标类型ID',
  `indicator_type_name` varchar(100) NOT NULL COMMENT '指标类型名称',
  `description` varchar(500) DEFAULT NULL COMMENT '指标说明',  -- 正确字段名
  `max_score` decimal(5,2) NOT NULL COMMENT '最高分值',
  -- ... 其他字段
);

修复方案

修复文件

  • 文件路径: backend/ruoyi-modules/ruoyi-xskh/src/main/resources/mapper/xskh/XskhAssessmentSelfScoreMapper.xml
  • 修复方法: 将SQL查询中的字段名从 i.indicator_description 改为 i.description

字段命名统一优化

为了保持前后端字段命名的一致性,同时进行了以下优化:

  1. VO类字段统一: 将 indicatorDescription 改为 description
  2. Mapper映射统一: 更新ResultMap中的字段映射
  3. 相关文件同步: 修改了所有相关的Mapper文件和VO类

具体修复内容

1. 修复ResultMap映射

<!-- 修复前 -->
<result property="indicatorDescription" column="indicator_description"/>

<!-- 修复后 -->
<result property="description" column="description"/>

2. 修复SQL查询语句

<!-- 修复前 -->
SELECT 
    s.id, s.application_id, s.indicator_id, s.indicator_name,
    i.indicator_code, i.indicator_description, s.indicator_type,
    -- ... 其他字段

<!-- 修复后 -->
SELECT 
    s.id, s.application_id, s.indicator_id, s.indicator_name,
    i.indicator_code, i.description, s.indicator_type,
    -- ... 其他字段

修复后的完整SQL

SELECT 
    s.id,
    s.application_id,
    s.indicator_id,
    s.indicator_name,
    i.indicator_code,
    i.description,  -- 修复:使用正确的字段名
    s.indicator_type,
    s.max_score,
    s.self_score,
    s.self_remark,
    s.teacher_score,
    s.teacher_remark,
    s.create_by,
    s.create_time,
    s.update_by,
    s.update_time
FROM xskh_assessment_self_score s
LEFT JOIN xskh_assessment_indicator i ON s.indicator_id = i.id AND i.tenant_id = '000000'
WHERE s.application_id = #{applicationId}
AND s.deleted = 0
AND s.tenant_id = '000000'
ORDER BY s.create_time ASC

验证结果

修复验证

  1. ✅ 字段映射正确: ResultMap中的 description 字段正确映射到数据库的 description 字段
  2. ✅ SQL语法正确: 查询语句使用正确的字段名,符合数据库表结构
  3. ✅ VO类兼容: XskhAssessmentSelfScoreVo 类中已正确定义 description 字段
  4. ✅ 字段命名统一: 前后端字段名保持一致,避免混淆

测试建议

  1. 接口测试: 重新调用 /assessment/approval/{id} 接口,确认不再出现字段错误
  2. 数据验证: 确认返回的指标说明数据正确显示
  3. 功能测试: 测试学生考核审核功能,确认自评得分查询正常

经验总结

开发规范提醒

  1. 字段命名一致性: SQL查询中的字段名必须与数据库表结构完全一致
  2. 数据库设计规范: 遵循项目统一的字段命名规范,避免混淆
  3. 代码审查: 在开发过程中注意检查SQL语句的字段名正确性

预防措施

  1. 数据库文档: 及时更新数据库设计文档,确保字段名准确
  2. 代码规范: 建立SQL编写规范,要求字段名与数据库表结构保持一致
  3. 测试覆盖: 增加SQL语法检查的自动化测试

相关文件

  • 数据库设计: docs/设计文档/database/学生考核管理/学生考核管理数据库模型.sql
  • Mapper文件:
    • backend/ruoyi-modules/ruoyi-xskh/src/main/resources/mapper/xskh/XskhAssessmentSelfScoreMapper.xml
    • backend/ruoyi-modules/ruoyi-xskh/src/main/resources/mapper/xskh/XskhAssessmentPlanMapper.xml
  • VO类:
    • backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/vo/XskhAssessmentSelfScoreVo.java
    • backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/vo/XskhAssessmentPlanIndicatorVo.java

修复人员: Cursor AI
修复时间: 2025-08-21
修复状态: ✅ 已完成