it-swarm.com.de

java.sql.SQLException: Ungültiger Spaltenname

Ich kann nicht herausfinden, warum ich "Ungültiger Spaltenname" hier bekomme.

Wir haben eine Variante von SQL direkt in Oracle ausprobiert, und es funktioniert gut, aber wenn ich es mit jdbcTemplate versuche, stimmt etwas nicht.

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();
                });

Die gesamte SQL, die unter Oracle funktioniert, lautet wie folgt:

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

Der gesamte Stacktrace:

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
4
Shervin Asgari

Das Problem ist nicht die Abfrage. Die Abfrage läuft einwandfrei.

Das Problem liegt in der Zeilenzuordnung, die eine Zeile aus der Variable ResultSet in ein Domänenobjekt konvertiert. Es scheint, dass Sie als Teil der Zeilenzuordnung in Ihrer Anwendung versuchen, aus der ResultSet einen Wert aus einer Spalte zu lesen, die sie nicht enthält.

Die wichtigsten Zeilen Ihres Stacktraces sind die folgenden drei am unteren Rand:

    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)

Die Mitte dieser drei Zeilen scheint in Ihrem Code zu sein. Zeile 69 Ihrer Application-Klasse enthält ein Lambda, das ResultSet.getString() aufruft. Da dies jedoch zu einem Fehler "Ungültiger Spaltenname" führt, übergeben Sie (a) einen String für einen Spaltennamen und nicht für einen numerischen Spaltenindex ) Der übergebene Spaltenname ist in der Ergebnismenge nicht vorhanden.

Nachdem Sie Ihre Frage so bearbeitet haben, dass sie den Aufruf von jdbcTemplate.query() enthält, und insbesondere das Lambda, das für die Zuordnung einer Ergebnismengenzeile zu einem Objekt verantwortlich ist, ist das Problem etwas klarer. Fügen Sie beim Aufrufen von rs.getInt(...) oder rs.getString(...) mit Spaltennamen im Gegensatz zu Indizes keine Präfixe wie p. oder x. ein. Anstelle von rs.getInt("p.applicationid") oder rs.getInt("x.datadocumentid") schreiben Sie rs.getInt("applicationid") oder rs.getInt("datadocumentid").

11
Luke Woodward

Sie benötigen die Tabellendefinition, um herauszufinden, wo das Problem liegt. Installieren/Ausführen von Oracle SQL Developer (kostenlos), Einrichten einer JDBC-Verbindung und Untersuchen des Schemas.

Sie müssen das Vorhandensein folgender Spalten überprüfen:

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