NamedParameterJdbcTemplate НЕ ПОДДЕРЖИВАЕТ СУММУ ()? - PullRequest
0 голосов
/ 15 мая 2018

Я использую NamedParameterJdbcTemplate , ниже SQL хорошо работает в Oraclie SQL Developer.

выберите сумму (PRINTEDLICNUM), сумму (PRINTEDLICCOPYNUM), PRIPID из LICENSEPRINTRECORD, где PRIPID в ('3702122300278)BY PRIPID;

Но этот код не работает в NamedParameterJdbcTemplate

Map namedParameters = Collections.singletonMap("pripids", pripIds);
StringBuffer recordQueryString = new StringBuffer();
recordQueryString.append("SELECT SUM(PRINTEDLICNUM), SUM(PRINTEDLICCOPYNUM), PRIPID from LICENSEPRINTRECORD where PRIPID in (:pripids) GROUP BY PRIPID");
List<PreviousPrintRecords> records = template.query(recordQueryString.toString(), namedParameters, new RowMapper<PreviousPrintRecords>());

Ниже приведен мой класс RowMapper:

public class PreviousPrintRecords implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = -3763072257141955974L;
private int printedLicNum;
private int printedLicCopyNum;
private String pripId;  

public PreviousPrintRecords() {
    super();
}

public PreviousPrintRecords(int printedLicNum, int printedLicCopyNum, String pripId) {
    super();
    this.printedLicNum = printedLicNum;
    this.setPrintedLicCopyNum(printedLicCopyNum);
    this.pripId = pripId;
}

public int getPrintedLicNum() {
    return printedLicNum;
}

public void setPrintedLicNum(int printedLicNum) {
    this.printedLicNum = printedLicNum;
}

public String getPripId() {
    return pripId;
}

public void setPripId(String pripId) {
    this.pripId = pripId;
}

public int getPrintedLicCopyNum() {
    return printedLicCopyNum;
}

public void setPrintedLicCopyNum(int printedLicCopyNum) {
    this.printedLicCopyNum = printedLicCopyNum;
}

}

Произойдет ошибка, вложенное исключение: java.sql.SQLException: недопустимое имя столбца

ниже приведена подробная трассировка:

10:48:09,477 INFO  [stdout] (DefaultThreadPoolService1) 2018-05-15 10:48:09 INFO  o.s.j.support.SQLErrorCodesFactory - SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase, Hana]
10:48:09,532 INFO  [stdout] (DefaultThreadPoolService1) 2018-05-15 10:48:09 ERROR c.a.p.a.task.GetLicenseItemListTask - Get licenseitem task occurs error org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT SUM(PRINTEDLICNUM), SUM(PRINTEDLICCOPYNUM), PRIPID from LICENSEPRINTRECORD where PRIPID in (?, ?, ?, ?, ?, ?, ?) GROUP BY PRIPID]; nested exception is java.sql.SQLException: Invalid column name

10:48:09,532 INFO  [stdout] (DefaultThreadPoolService1)     at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:231)

10:48:09,532 INFO  [stdout] (DefaultThreadPoolService1)     at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)

10:48:09,532 INFO  [stdout] (DefaultThreadPoolService1)     at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:649)

10:48:09,532 INFO  [stdout] (DefaultThreadPoolService1)     at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:684)

10:48:09,532 INFO  [stdout] (DefaultThreadPoolService1)     at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:711)

10:48:09,533 INFO  [stdout] (DefaultThreadPoolService1)     at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:761)

10:48:09,533 INFO  [stdout] (DefaultThreadPoolService1)     at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:192)

10:48:09,533 INFO  [stdout] (DefaultThreadPoolService1)     at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:199)

10:48:09,534 INFO  [stdout] (DefaultThreadPoolService1)     at com.aw.product.abp.licenseprint.service.DaoLicensePrintService.requestLicensePrintItemData(DaoLicensePrintService.java:167)

10:48:09,534 INFO  [stdout] (DefaultThreadPoolService1)     at com.aw.product.abp.task.GetLicenseItemListTask.run(GetLicenseItemListTask.java:85)

10:48:09,534 INFO  [stdout] (DefaultThreadPoolService1)     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)

10:48:09,534 INFO  [stdout] (DefaultThreadPoolService1)     at java.util.concurrent.FutureTask.run(FutureTask.java:266)

10:48:09,534 INFO  [stdout] (DefaultThreadPoolService1)     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

10:48:09,535 INFO  [stdout] (DefaultThreadPoolService1)     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

10:48:09,535 INFO  [stdout] (DefaultThreadPoolService1)     at java.lang.Thread.run(Thread.java:745)

10:48:09,535 INFO  [stdout] (DefaultThreadPoolService1) Caused by: java.sql.SQLException: Invalid column name

10:48:09,535 INFO  [stdout] (DefaultThreadPoolService1)     at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)

10:48:09,535 INFO  [stdout] (DefaultThreadPoolService1)     at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)

10:48:09,537 INFO  [stdout] (DefaultThreadPoolService1)     at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)

10:48:09,539 INFO  [stdout] (DefaultThreadPoolService1)     at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)

10:48:09,539 INFO  [stdout] (DefaultThreadPoolService1)     at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)

10:48:09,539 INFO  [stdout] (DefaultThreadPoolService1)     at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:445)

10:48:09,539 INFO  [stdout] (DefaultThreadPoolService1)     at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:3367)

10:48:09,540 INFO  [stdout] (DefaultThreadPoolService1)     at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:2009)

10:48:09,540 INFO  [stdout] (DefaultThreadPoolService1)     at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:494)

10:48:09,540 INFO  [stdout] (DefaultThreadPoolService1)     at org.jboss.jca.adapters.jdbc.WrappedResultSet.getString(WrappedResultSet.java:1381)

10:48:09,540 INFO  [stdout] (DefaultThreadPoolService1)     at com.aw.product.abp.licenseprint.service.DaoLicensePrintService$2.mapRow(DaoLicensePrintService.java:173)

10:48:09,540 INFO  [stdout] (DefaultThreadPoolService1)     at com.aw.product.abp.licenseprint.service.DaoLicensePrintService$2.mapRow(DaoLicensePrintService.java:1)

10:48:09,541 INFO  [stdout] (DefaultThreadPoolService1)     at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93)

10:48:09,541 INFO  [stdout] (DefaultThreadPoolService1)     at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:60)

10:48:09,541 INFO  [stdout] (DefaultThreadPoolService1)     at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:697)

10:48:09,543 INFO  [stdout] (DefaultThreadPoolService1)     at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633)

10:48:09,543 INFO  [stdout] (DefaultThreadPoolService1)     ... 12 more

Не поддерживает ли NamedParameterJdbcTemplateфункция суммы?Если я хочу использовать функцию суммы, есть ли способ достичь этого?

1 Ответ

0 голосов
/ 15 мая 2018

java.sql.SQLException: Неверное имя столбца

Исключение достаточно ясно.Вы неправильно назвали имя столбца таблицы.

Вы используете rowMapper class, но не определяете имя столбца.

Измените код, как показано ниже

recordQueryString.append("SELECT SUM(PRINTEDLICNUM) AS printedLicNum, SUM(PRINTEDLICCOPYNUM) AS printedLicCopyNum, PRIPID from LICENSEPRINTRECORD where PRIPID in (:pripids) GROUP BY PRIPID");
...