2017-01-23 232 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(); 
       }); 

オラクルに取り組んでいます全体の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正直に分かりません。誰かがこのSQLを送信してくれたので、私はOracleで直接実行していることがわかりました。だから私はそれが動作するはずです知っている。しかし、 "無効な列名"は、Oracleからのエラーではないことを意味しますが、spring-jdbcは自己です。だから私は思っていたはずのものでなければなりません。ただ私にはありません:) –

+0

あなたは無効な列の名前さえ持っていないのですか?どのようにしてあなたを助けることができるでしょうか? –

答えて

6

問題は、クエリではありません。クエリは正常に実行されています。

問題は、行をResultSetからドメインオブジェクトに変換する行マッピングにあります。アプリケーションの行マッピングの一部として、含まれていない列の値をResultSetから読み取ろうとしているようです。

あなたのスタックトレースのキーラインが底部近く、3次の通りである。

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) 

これら3行の真ん中には、あなたのコードであるように思われます。 Applicationクラスの行69にはResultSet.getString()を呼び出すラムダが含まれていますが、この結果、「列名が無効です」というエラーが発生するため、(a)数値の列インデックスではなく列名の文字列を渡しています。 )渡す列名が結果セットに存在しません。

jdbcTemplate.query()への呼び出しを含めるように質問を編集したので、特に結果セットの行をオブジェクトにマップするラムダが問題を少しはっきりさせています。 または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.'を削除します: 'p.applicationid'ではなく' applicationid'または 'datadocumentid'でなければなりません。 '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