2025-06-12 10:19:35.256 ERROR 19812 --- [nio-8080-exec-1] c.e.a.exception.GlobalExceptionHandler : 服务器异常 org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: org.postgresql.util.PSQLException: ERROR: column "fisc_div_code" does not exist Position: 1364 Where: referenced column: fiscaldivcode ### The error may exist in com/example/ayfinanceadmin/mapper/base/sysAdmAgencyMapper.java (best guess) ### The error may involve defaultParameterMap ### The error occurred while setting parameters ### SQL: SELECT chr_id,set_year,chr_code,disp_code,chr_name,level_num,is_leaf,enabled,create_date,create_user,latest_op_date,is_deleted,latest_op_user,chr_code1,chr_code2,chr_code3,chr_code4,chr_code5,rg_code,main_code,union_code,en_property,sort_property,en_charge,finance_charge,clerk,district_number,telephone,extension_number,address,manage_level,relation,parent_id,chr_id1,chr_id2,chr_id3,chr_id4,chr_id5,chr_code6,chr_code7,chr_code8,chr_code9,chr_id6,chr_id7,chr_id8,chr_id9,is_reform,start_date,end_date,secretdegree,isbudget,luload_mod,en_cf_mod,reserve_amt,reserve_start,reserve_used,mb_id,div_kind,div_fmkind,is_legalinc,en_type,editor,quic_code,is_gztf,trun_in_acct AS trInAcct,fina_level,is_self,co_type_code,post_code,url,enabled_ebank_date AS enabledDate,ebank_enterprise_no AS ebEnterpriseNo,enabled_ebank AS enabledBank,old_chr_id,hirer_id,co_fullname,last_ver,remark,co_name1,co_name2,co_name3,org_code,co_fzr_tel,cw_fzr_tel,acc_book_type_name,is_financial,is_budg AS isBu,is_acc,is_self2,budg_co_code AS buCoCode,budg_co_name AS buCoName,final_co_code,final_co_name,budg_level AS buLevel,fi_co_code,fi_co_dept_code,bm_co_code,is_enable,xxzx_charge,xxzx_charge_tel AS xxChargeTel,chr_fullname,parent_code,web_url,dist_code,agency_code,dist_name,ass_code,area_zone,currency_code,leader_charge,short_name,src_agency_code,fisc_div_id AS fiscalDivId,tutype,fisc_div_code AS fiscalDivCode FROM sys_adm_agency WHERE (chr_code = ? AND set_year = ? AND
时间: 2025-07-01 12:47:25 浏览: 15
<think>我们正在处理一个SpringBoot应用程序与PostgreSQL数据库交互时出现的错误。错误信息明确提到:`column'fisc_div_code'doesnotexistintablesys_adm_agency`。这意味着在查询中引用了表`sys_adm_agency`中一个不存在的列`fisc_div_code`。###问题分析1.**错误原因**:SQL查询中引用了不存在的列名。2.**可能原因**:-数据库表中确实没有这个列。-列名在数据库中是另一个名字(可能是大小写问题)。-应用程序的实体类(Entity)或映射配置错误。###解决步骤####步骤1:检查数据库表结构首先,我们需要确认表`sys_adm_agency`是否存在列`fisc_div_code`。可以使用以下SQL查询:```sqlSELECTcolumn_nameFROMinformation_schema.columnsWHEREtable_name='sys_adm_agency'ANDcolumn_name='fisc_div_code';```如果查询结果为空,则说明该列不存在。####步骤2:检查列名大小写PostgreSQL默认对列名是大小写不敏感的,但如果你在创建表时使用了双引号,那么列名就是大小写敏感的。例如,如果你创建表时使用了`"Fisc_Div_Code"`,那么在查询时必须使用双引号和相同的大小写。在应用程序中,如果实体类使用了类似`@Column(name="fisc_div_code")`,但实际列名是`FISC_DIV_CODE`或`fisc_div_code`(注意,PostgreSQL内部实际上转换为小写,除非使用双引号),则需要确保匹配。####步骤3:检查应用程序中的实体类在SpringBoot中,实体类通常使用JPA注解。检查对应的实体类`SysAdmAgency`(或类似名称)中是否有一个字段映射到`fisc_div_code`。例如:```java@Column(name="fisc_div_code")privateStringfiscDivCode;```如果数据库中的列名是`fisc_div_code`(小写),那么这样映射是正确的。但注意,如果数据库中的列名是`FISC_DIV_CODE`(大写)且创建时使用了双引号,那么在应用程序中应该使用:```java@Column(name="FISC_DIV_CODE")privateStringfiscDivCode;```或者,更常见的做法是,在数据库中统一使用小写字母,避免大小写问题。####步骤4:检查查询语句如果错误发生在自定义查询(例如使用`@Query`注解的JPQL或原生SQL)中,那么需要检查查询语句中引用的列名是否正确。例如:```java@Query(value="SELECTfisc_div_codeFROMsys_adm_agency",nativeQuery=true)List<String>findFiscDivCodes();```这里确保列名和表名都正确。####步骤5:修复方案-**方案1(推荐)**:如果数据库表缺少该列,那么需要添加该列。可以使用以下SQL:```sqlALTERTABLEsys_adm_agencyADDCOLUMNfisc_div_codeVARCHAR(255);--根据实际类型调整```-**方案2**:如果该列实际存在于表中,但名称不同,那么需要修改实体类中的`@Column`注解,使其与数据库中的列名匹配。-**方案3**:在SQL查询中使用正确的列名(如果是大小写敏感的情况,需要加双引号)。但尽量在应用程序和数据库中统一使用小写列名,避免使用双引号。####步骤6:重新启动应用程序修复后,重新启动SpringBoot应用程序并测试。###总结该错误通常是由于数据库表结构和应用程序实体类之间的不一致导致的。重点检查数据库表结构以及实体类中字段的映射关系。###相关问题1.如何避免在SpringBoot应用中因数据库列名大小写导致的问题?2.如何使用Flyway或Liquibase进行数据库版本管理来同步表结构?3.在PostgreSQL中,如何批量修改表结构以符合应用程序的实体类定义?</think>
### 定位并修复 `column 'fisc_div_code' does not exist` 错误
#### 📍 错误原因分析
1. **问题核心**:Spring Boot 应用程序查询 PostgreSQL 时,`sys_adm_agency` 表中缺少 `fisc_div_code` 字段
2. **根本原因**:
- **数据库表结构不匹配**:表结构未包含该字段或名称不一致(大小写敏感问题)
- **实体类/JPA映射错误**:`@Column` 注解配置错误或字段未同步更新
- **SQL查询硬编码问题**:JPQL/HQL 查询直接引用了不存在的字段名
#### 🔧 解决步骤(附具体操作)
##### 步骤1:验证数据库表结构
在 PostgreSQL 中执行查询:
```sql
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'sys_adm_agency';
```
若结果中无 `fisc_div_code` 列:
1. **添加缺失列**:
```sql
ALTER TABLE sys_adm_agency ADD COLUMN fisc_div_code VARCHAR(50);
```
2. **检查大小写敏感**:
```sql
-- PostgreSQL 默认小写存储,大写需加双引号
SELECT "Fisc_Div_Code" FROM sys_adm_agency;
```
##### 步骤2:检查实体类映射
```java
@Entity
@Table(name = "sys_adm_agency")
public class SysAdmAgency {
// ✅ 正确声明(匹配数据库列名)
@Column(name = "fisc_div_code") // PostgreSQL 默认小写
private String fiscDivCode;
// ❌ 错误示例(名称不一致)
@Column(name = "fiscDivCode") // 导致匹配失败
private String fiscalDivision;
}
```
##### 步骤3:修复SQL查询
1. **JPQL查询修复**:
```java
// ❌ 错误(字段名大小写不匹配)
@Query("SELECT a.fiscDivCode FROM SysAdmAgency a")
// ✅ 正确(使用实体属性名,非数据库列名)
@Query("SELECT a.fiscDivCode FROM SysAdmAgency a")
```
2. **原生SQL修复**:
```sql
-- ❌ 错误(未处理大小写)
SELECT fisc_div_code FROM sys_adm_agency
-- ✅ 正确(PostgreSQL 需引号包裹大写)
SELECT "fisc_div_code" FROM sys_adm_agency
```
##### 步骤4:同步数据库架构(Spring Boot配置)
在 `application.properties`:
```properties
# 自动更新表结构(谨慎用于生产!)
spring.jpa.hibernate.ddl-auto=update
# 强制JPA使用小写命名策略
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
```
#### 🛡️ 预防措施
1. **版本控制数据库变更**:
- 使用 Liquibase/Flyway 管理 DDL 脚本
2. **实体字段更新流程**:
```mermaid
graph LR
A[修改实体类] --> B[生成迁移脚本]
B --> C[测试环境验证]
C --> D[生产环境执行]
```
3. **统一命名规范**:
- 数据库:全小写+下划线 (snake_case)
- Java实体:驼峰命名 (camelCase)
#### 💡 示例修复代码
```java
// 修复后的实体类片段
@Entity
@Table(name = "sys_adm_agency")
public class SysAdmAgency {
@Id
private Long id;
@Column(name = "fisc_div_code") // 明确匹配小写列名
private String fiscalDivisionCode;
}
```
#### ✅ 验证方法
```bash
# 启动应用时检查Hibernate日志
DEBUG org.hibernate.SQL - SELECT ... fisc_div_code ...
```
> **关键点**:PostgreSQL 列名 **默认小写存储**。若创建表时使用大写(需加双引号),查询时也必须加双引号,否则系统转为小写匹配[^1]。
---
### 相关问题
1. 如何在 Spring Boot 中配置 Hibernate 命名策略以兼容 PostgreSQL 大小写规则?
2. 使用 Flyway 进行数据库版本控制时,如何安全地添加新字段?
3. 实体类字段与数据库列名映射的常见错误有哪些?
4. 如何通过 Hibernate 日志快速定位 SQL 映射错误?
阅读全文
相关推荐



















