Spring Boot无法映射PostgreSQL驼峰数据库列如何解决?
解决Spring Boot映射Odoo 17 PostgreSQL驼峰列返回null的问题
问题根源
PostgreSQL默认会将未加双引号的标识符转换为小写,而Odoo创建的驼峰式列名在数据库中是大小写敏感的带引号标识符(比如实际列名是"partidaId"而非partidaid)。当前你的@Column注解中直接写name = "partidaId",Hibernate会自动将其转为小写partidaid,导致无法匹配数据库中的实际列,最终返回null。
解决方案
方案一:给@Column的name属性添加转义双引号
修改所有驼峰列的@Column注解,将列名用双引号包裹(Java字符串中需要用\转义双引号),确保Hibernate原样使用列名:
@Entity @Table(name="tournment_tournment") public class GameData { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "\"Id\"") private Integer id; @Column(name = "\"partidaId\"") private String partidaId; @Column(name = "izena") private String izena; @Column(name = "\"IdEnpresa\"") private Integer idEnpresa; @Column(name = "\"jaiotzeData\"") private Date jaiotzeData; @Column(name = "puntuazioa") private Integer puntuazioa; @Column(name = "lanpostua") private String lanpostua; @Column(name = "jokoa") private Integer jokoa; @Column(name = "\"partidaData\"") private Date partidaData; // 其余非驼峰列保持不变 @Column(name = "create_date") private LocalDateTime create_date; @Column(name = "write_date") private LocalDateTime write_date; @Column(name = "create_uid") private Integer create_uid; @Column(name = "write_uid") private Integer write_uid; /* Constructor getters and setter*/ }
方案二:全局配置Hibernate命名策略
如果不想逐个修改列注解,可以在Spring Boot配置文件中添加配置,让Hibernate保留标识符的原始大小写:
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
配置后,@Column中的name值会被原样发送给数据库,无需额外加引号,但要确保所有列名的大小写与数据库中完全一致。
验证
修改完成后重启应用,查询API即可看到驼峰列的正常数据返回。
内容的提问来源于stack exchange,提问作者UnaiZelaia
相关产品推荐
相关产品推荐

