Spring Boot使用Docker部署PostgreSQL出现column does not exist错误如何解决
错误根本原因
- PostgreSQL默认对未加双引号的SQL标识符做小写转换,你实体类中显式指定的驼峰列名
differenceToLexiFiPriceScore,在Hibernate生成SQL时未加双引号,被PostgreSQL自动转成全小写的differencetolexifipricescore,和数据库表中实际的列名不匹配。 - 你的Hibernate配置存在冲突:
spring.jpa.hibernate.ddl-auto是Spring Boot的配置项,写在原生hibernate.cfg.xml中不生效,原生Hibernate对应的DDL自动更新配置key为hibernate.hbm2ddl.auto,导致DDL更新逻辑未触发,数据库表未生成对应的列。 - 之前使用H2数据库正常是因为H2对大小写的处理规则更宽松,不会强制转小写,所以不会出现命名不匹配问题。
解决方案
方案1:统一使用PostgreSQL标准命名规则(推荐)
将所有实体类中驼峰格式的@Column(name)值改为下划线分隔的全小写格式,符合PostgreSQL的命名习惯,从根源避免大小写问题:
// 修改前 @Column(name = "differenceToLexiFiPriceScore") Float differenceToLexiFiPriceScore; @Column(name = "distanceToBandsScore") Float distanceToBandsScore; @Column(name = "metricC") Float metricC; // 修改后 @Column(name = "difference_to_lexifi_price_score") Float differenceToLexiFiPriceScore; @Column(name = "distance_to_bands_score") Float distanceToBandsScore; @Column(name = "metric_c") Float metricC;
方案2:保留驼峰列名,配置Hibernate自动给标识符加双引号
在hibernate.cfg.xml的session-factory节点下添加如下配置,让Hibernate生成SQL时自动给所有表名、列名加双引号,PostgreSQL就会保留大小写:
<property name="hibernate.globally_quoted_identifiers">true</property>
也可以单独给需要保留大小写的列手动加双引号:
@Column(name = "\"differenceToLexiFiPriceScore\"") Float differenceToLexiFiPriceScore;
方案3:修复配置冲突,确保DDL自动更新生效
删除hibernate.cfg.xml中spring.jpa开头的配置项,这类Spring Boot专属配置放到原生Hibernate配置文件中不会生效,如需在Hibernate配置文件中开启DDL自动更新,替换为原生配置:
<!-- 替换原有的spring.jpa.hibernate.ddl-auto配置 --> <property name="hibernate.hbm2ddl.auto">update</property>
也可以直接删除hibernate.cfg.xml中的相关JPA配置,统一通过Spring Boot的application.yml或者docker-compose的环境变量配置,优先级更高。
验证步骤
修改配置后先手动登录PostgreSQL容器,查看表结构确认列名是否匹配:
# 进入PostgreSQL容器 docker exec -it db psql -U <你的postgres用户名> compose-postgres # 查看rtdatabase表结构 \d rtdatabase
对比输出的列名和Hibernate生成SQL中的列名是否一致即可。
内容的提问来源于stack exchange,提问作者user16806803
相关产品推荐
相关产品推荐

