You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot JPA无法找到PostgreSQL中已存在的birthDay列

Spring Boot JPA 列名映射错误问题:birthDay 被转为 birth_day 的原因与解决

问题原因

  • Hibernate默认命名策略自动转换:Spring Data JPA默认采用Hibernate作为实现,它的SpringPhysicalNamingStrategy会自动将实体类中的驼峰式字段(如birthDay)转换为蛇形命名(birth_day)。即便添加了@Column(name = "birthDay"),若命名策略配置优先级更高,注解指定的列名会被覆盖,导致生成错误的SQL语句。
  • PostgreSQL列名大小写规则限制:PostgreSQL对标识符的大小写有特殊处理——创建列时如果未用双引号包裹列名,数据库会自动将其转换为小写;若你的数据库列名是驼峰格式的birthDay,则创建表时一定使用了双引号(如CREATE TABLE person ("birthDay" DATE))。但JPA生成的SQL未给列名添加双引号,PostgreSQL会将birth_day解析为小写列名,与实际的"birthDay"列不匹配,从而报错。
  • 注解配置失误:可能存在@Column的name属性拼写错误(比如误写为小写的birthday),或者实体类字段名与注解配置不一致的情况。

解决方法

1. 调整Hibernate命名策略配置

在application.properties或application.yml中配置物理命名策略,使其严格遵循@Column注解指定的列名,不自动进行格式转换:

application.properties 配置:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

application.yml 配置:

spring:
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

该策略会完全使用注解中指定的列名,不会执行驼峰转蛇形的转换操作。

2. 适配PostgreSQL列名规则

如果不想修改命名策略,可以通过调整数据库或实体类配置来适配:

  • 修改数据库列名:将birthDay列重命名为birth_day(无需双引号,PostgreSQL默认存储为小写),实体类可将@Column改为@Column(name = "birth_day"),甚至直接去掉@Column注解,让默认命名策略自动匹配。
  • 保留驼峰列名:修改实体类的@Column注解,给列名添加双引号(Java中需转义):
@Column(name = "\"birthDay\"")
private LocalDate birthDay;

这样JPA生成的SQL会包含双引号,PostgreSQL就能正确识别驼峰格式的列名。

3. 检查并修正注解配置

仔细核对实体类中@Column的name属性值,确保与数据库列名完全一致(包括大小写),同时确认实体类字段名拼写无误。

内容的提问来源于stack exchange,提问作者AlexJP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 16:01:33