使用createNativeQuery查询PostgreSQL时混合大小写列名被转小写报错
问题根因
PostgreSQL默认对未加双引号的SQL标识符(表名、列名等)会自动转为全小写后再执行匹配。你看到Hibernate打印的SQL里列名是正确的admission_type_L1,但因为没有双引号包裹,PostgreSQL解析时会自动转成全小写admission_type_l1,如果建表时你是通过双引号指定的大小写混合形式的列名,就会出现找不到列的报错。
解决方案
- 方案1:直接修改原生查询语句,给大小写混合的列名加双引号,Java代码中需要对双引号做转义处理,修改后代码如下:
Query query = entityManager.createNativeQuery("SELECT distinct a.\"admission_type_L1\" FROM admission_type a"); List<String> result = query.getResultList();
- 方案2:调整表结构命名,这是PostgreSQL的推荐实践,将所有表、列名统一改为全小写蛇形命名,比如把
admission_type_L1修改为admission_type_l1,后续所有查询都不需要额外处理双引号,从根源避免同类问题。 - 方案3:如果你使用JPA实体类映射该表字段,可在对应字段的
@Column注解中明确指定带双引号的列名,示例如下:
@Column(name = "\"admission_type_L1\"") private String admissionTypeL1;
内容的提问来源于stack exchange,提问作者Maverick
相关产品推荐
相关产品推荐

