返回 Bug 清单
BUG-0332project-47中已修复backend-logic

native SQL 与实体映射漂移 —— 改列名/枚举后报表接口集体失效

发现:2026-10-01验证:2026-10-27置信度:90%

症状

管理端报表接口报 SQL 异常:列不存在;或枚举值过滤条件静默匹配不到任何行。

根因

native SQL 绕过 Hibernate 实体映射,schema 演进(改列名、枚举值规范化)不会传播到散落各处的手写 SQL;JPQL 才会被元数据校验兜住。

修复方案

1) 报表/统计能用 JPQL 就用 JPQL,靠类型校验防漂移; 2) 必须用 native SQL 的(窗口函数等),在测试环境建一条『全报表查询冒烟』集成测试,启动/CI 阶段就真实执行每一条,把漂移提前到部署前; 3) 枚举值过滤统一引用枚举类常量,不在 SQL 里写字面量。

检测命令

grep -rn 'nativeQuery = true' --include='*.java'  # 逐条核对列名与枚举字面量

错误签名

@Query(nativeQuery=true) 引用的列名/枚举值与实体不一致:refund_status→status、approved_at→complete_time、status IN ('DONE') 大小写失配

技术信息

来源项目

project-47

涉及文件

AdminReportService.java

标签

native-sql, schema-drift, report, jpa