2017-01-23 458 views
1

我不明白为什么我得到“无效的列名称”在这里。java.sql.SQLException:无效的列名称

我们在Oracle中直接尝试过一种sql的变体,它工作正常,但是当我使用jdbcTemplate进行尝试时,出现了一些问题。

List<Dataholder> alleXmler = jdbcTemplate.query("select p.applicationid, x.datadocumentid, x.datadocumentxml " + 
         "from CFUSERENGINE51.PROCESSENGINE p " + 
         "left join CFUSERENGINE51.DATADOCUMENTXML x " + 
         "on p.processengineguid = x.processengineguid " + 
         "where x.datadocumentid = 'Disbursment' " + 
         "and p.phasecacheid = 'Disbursed' ", 
       (rs, rowNum) -> { 
        return Dataholder.builder() 
          .applicationid(rs.getInt("p.applicationid")) 
          .datadocumentId(rs.getInt("x.datadocumentid")) 
          .xml(lobHandler.getClobAsString(rs, "x.datadocumentxml")) 
          .build(); 
       }); 

是在Oracle工作的整个SQL是这样的:

select 
process.applicationid, 
xml.datadocumentid, 
xml.datadocumentxml 
from CFUSERENGINE51.PROCESSENGINE process 
left join CFUSERENGINE51.DATADOCUMENTXML xml 
on process.processengineguid = xml. processengineguid 
where xml.datadocumentid = 'Disbursment' 
and process.phasecacheid = 'Disbursed' 
and process.lastupdatetime > sysdate-14 

整个堆栈跟踪:

java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run(AbstractRunMojo.java:507) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.IllegalStateException: Failed to execute CommandLineRunner 
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:803) 
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:784) 
    at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:771) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175) 
    at no.gjensidige.bank.datavarehus.kontonrinfridd.Application.main(Application.java:44) 
    ... 6 more 
Caused by: org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [select p.applicationid, x.datadocumentid, x.datadocumentxml from CFUSERENGINE51.PROCESSENGINE p left join CFUSERENGINE51.DATADOCUMENTXML x on p.processengineguid = x.processengineguid where x.datadocumentid = 'Disbursment' ]; nested exception is java.sql.SQLException: Invalid column name 
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:231) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:419) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:474) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:484) 
    at no.gjensidige.bank.datavarehus.kontonrinfridd.Application.run(Application.java:61) 
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:800) 
    ... 12 more 
Caused by: java.sql.SQLException: Invalid column name 
    at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:4146) 
    at oracle.jdbc.driver.InsensitiveScrollableResultSet.findColumn(InsensitiveScrollableResultSet.java:300) 
    at oracle.jdbc.driver.GeneratedResultSet.getString(GeneratedResultSet.java:1460) 
    at org.apache.commons.dbcp2.DelegatingResultSet.getString(DelegatingResultSet.java:267) 
    at org.apache.commons.dbcp2.DelegatingResultSet.getString(DelegatingResultSet.java:267) 
    at no.gjensidige.bank.datavarehus.kontonrinfridd.Application.lambda$run$0(Application.java:69) 
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93) 
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:60) 
    at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:463) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:408) 
    ... 16 more 
+0

您的表格是如何定义的?该变种如何直接在Oracle上尝试?请将它们添加到您的问题。 – Alfabravo

+0

@Alfabravo我真的不知道。我收到了某人发来的这个数据库,他告诉我它直接在Oracle中运行。所以我知道它应该工作。但是“无效的列名”意味着它不是Oracle的错误,而是spring-jdbc自身。所以这应该是我认为很明显的事情。只是不在我:) –

+0

所以你甚至没有无效列的名称?我们应该如何帮助你? –

回答

6

的问题是不是查询。查询运行良好。

问题在于将行从ResultSet转换为域对象的行映射。看起来,作为应用程序行映射的一部分,您尝试从其不包含的列中读取ResultSet的值。

您的堆栈跟踪的关键线以下三种,接近底部:

at org.apache.commons.dbcp2.DelegatingResultSet.getString(DelegatingResultSet.java:267) 
    at no.gjensidige.bank.datavarehus.kontonrinfridd.Application.lambda$run$0(Application.java:69) 
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93) 

这三条线的中间会出现在你的代码。 Application类的第69行包含一个调用ResultSet.getString()的lambda,但由于这会导致“无效列名称”错误,因此(a)传递的是字符串而不是数字列索引,而(b) )您传入的列名不存在于结果集中。

现在您已经编辑了您的问题以包含对jdbcTemplate.query()的调用,特别是负责将结果集行映射到对象的lambda表达式,问题会更清楚一些。当与索引相对应地呼叫rs.getInt(...)rs.getString(...)时,不要包括诸如p.x.之类的前缀。不要写rs.getInt("p.applicationid")rs.getInt("x.datadocumentid"),请写rs.getInt("applicationid")rs.getInt("datadocumentid")

+0

我认为你在这里的东西。它缺乏关于jdbcTemplate如何工作的知识。我已经用我如何读取数据的代码更新了这个问题。你能看看吗?我将getString()更改为getInt,但它仍然无效。 –

+0

我终于使用getObject(int index)工作了。谢谢。从错误信息中不太清楚。 –

+1

@ShervinAsgari:从调用getInt或getString的列名称中删除前缀“p.'和”x“:它们应该是applicationid或datadocumentid而不是'''p.applicationid'或者'x.datadocumentid'。 –

0

您需要的表定义,找出问题的所在。安装/运行Oracle SQL Developer(它是免费的),设置JDBC连接并调查架构。

您需要检查以下几列的存在:

CFUSERENGINE51.PROCESSENGINE.applicationid, 
CFUSERENGINE51.PROCESSENGINE.lastupdatetime 
CFUSERENGINE51.PROCESSENGINE.phasecacheid 
CFUSERENGINE51.PROCESSENGINE.processengineguid 
CFUSERENGINE51.DATADOCUMENTXML.datadocumentid 
CFUSERENGINE51.DATADOCUMENTXML.datadocumentxml 
CFUSERENGINE51.DATADOCUMENTXML.processengineguid