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

Spring Data Native JPA查询抛出"Invalid column name"异常求助

问题描述

已尝试解决该问题许久,先后尝试多种方案仍未解决。该功能此前运行正常,突然失效且无法恢复。

有一个Customer实体映射到原生SQL查询,试过添加@Column注解、设置物理/隐式命名策略等方法。直接在MySQL数据库中执行查询时,能按预期返回格式正确的数据,但通过JPA调用时抛出无效列名错误。

Repository代码

public interface CustomerRepository extends JpaRepository<CustomerEntity, Integer> {

    @Query(value = "SELECT * FROM (SELECT CUSTOMER_ID AS customerId, CUSTOMER_NAME AS customerName FROM CUSTDBO.CUSTOMERS)", nativeQuery = true)
    List<CustomerEntity> getCustomerData();

}

实体类代码

@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class CustomerEntity {

    @Id
    private int customerId;

    private String customerName;
}

错误信息

java.sql.SQLException: Invalid column name

Hibernate执行日志

Hibernate: 
SELECT
    *
FROM
    ( SELECT
        CUSTOMER_ID AS customerId,
        CUSTOMER_NAME AS customerName
    FROM
        CUSTDBO.CUSTOMERS )

完整堆栈跟踪

2023-02-21 18:28:33.292  WARN 8832 --- [nio-8080-exec-1] 
o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 17006, SQLState: 
99999
2023-02-21 18:28:33.292 ERROR 8832 --- [nio-8080-exec-1] 
o.h.engine.jdbc.spi.SqlExceptionHelper   : Invalid column name
2023-02-21 18:28:33.322 ERROR 8832 --- [nio-8080-exec-1] o.a.c.c.C.[.[.    [/].[dispatcherServlet]    : Servlet.service() for servlet     [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is     
org.springframework.orm.jpa.JpaSystemException: could not execute query; nested exception is org.hibernate.exception.GenericJDBCException: could not execute query] with root cause

java.sql.SQLException: Invalid column name
    at 
 
 
oracle.jdbc.driver.OracleStatement.getColumnIndexPrimitive(OracleStatement.java:4257) ~[ojdbc8-21.5.0.0.jar:21.5.0.0.0]
    at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:4215) ~[ojdbc8-21.5.0.0.jar:21.5.0.0.0]
    at oracle.jdbc.driver.InsensitiveScrollableResultSet.findColumn(InsensitiveScrollableResultSet.java:299) ~[ojdbc8-21.5.0.0.jar:21.5.0.0.0]
    at oracle.jdbc.driver.GeneratedResultSet.getString(GeneratedResultSet.java:662) ~[ojdbc8-21.5.0.0.jar:21.5.0.0.0]
    at com.zaxxer.hikari.pool.HikariProxyResultSet.getString(HikariProxyResultSet.java) ~[HikariCP-4.0.3.jar:na]
    at org.hibernate.type.descriptor.sql.VarcharTypeDescriptor$2.doExtract(VarcharTypeDescriptor.java:62) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]     
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]     
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:249) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]     
    at org.hibernate.loader.Loader.getInstanceClass(Loader.java:1949) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1732) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.loader.Loader.getRow(Loader.java:1624) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:748) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.loader.Loader.getRowsFromResultSet(Loader.java:1047) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.loader.Loader.processResultSet(Loader.java:998) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.loader.Loader.doQuery(Loader.java:967) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:357) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2868) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2850) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2682) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.loader.Loader.list(Loader.java:2677) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:338) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2186) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1204) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:177) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1617) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.query.Query.getResultList(Query.java:165) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:128) ~[spring-data-jpa-2.7.0.jar:2.7.0]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:90) ~[spring-data-jpa-2.7.0.jar:2.7.0]
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:156) ~[spring-data-jpa-2.7.0.jar:2.7.0]
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:144) ~[spring-data-jpa-2.7.0.jar:2.7.0]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.7.7.jar:2.7.7]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.7.7.jar:2.7.7]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:160) ~[spring-data-commons-2.7.7.jar:2.7.7]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:139) ~[spring-data-commons-2.7.7.jar:2.7.7]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.25.jar:5.3.25]        
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:81) ~[spring-data-commons-2.7.7.jar:2.7.7]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.25.jar:5.3.25]        
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.25.jar:5.3.25]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.25.jar:5.3.25]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.25.jar:5.3.25]        
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.25.jar:5.3.25]        
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.25.jar:5.3.25]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.25.jar:5.3.25]        
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:145) ~[spring-data-jpa-2.7.0.jar:2.7.0]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.25.jar:5.3.25]        
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.25.jar:5.3.25]      
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.25.jar:5.3.25]        
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.25.jar:5.3.25]
解决思路
  • 核对数据库连接:堆栈显示使用Oracle JDBC驱动,但描述中提到MySQL执行正常,需确认应用当前连接的数据库实例是否正确,避免连接串配置错误导致访问了错误的数据库。
  • 简化原生查询:移除子查询,直接使用SELECT CUSTOMER_ID AS customerId, CUSTOMER_NAME AS customerName FROM CUSTDBO.CUSTOMERS测试,子查询可能导致数据库返回的列名处理异常。
  • 显式配置列映射:在实体字段上添加@Column注解明确对应数据库列名,示例:
    @Id
    @Column(name = "CUSTOMER_ID")
    private int customerId;
    
    @Column(name = "CUSTOMER_NAME")
    private String customerName;
    
  • 修正Hibernate命名策略:检查Hibernate物理命名策略配置,避免自动转换列名导致不匹配,可在配置文件中设置:
    spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    
  • 处理Oracle别名大小写:Oracle对列别名大小写敏感,可尝试用双引号包裹别名(如CUSTOMER_ID AS "customerId"),确保别名与实体字段大小写完全一致。
  • 排查依赖版本变更:功能此前正常,突然失效可能是依赖更新导致,检查spring-data-jpa、hibernate-core、ojdbc等依赖的版本,尝试回退到之前的稳定版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:33:21