Я работаю над микросервисным приложением весенней загрузки 2, использующим JDBCTemplate для получения данных из базы данных Oracle.
Я пробовал следующий код SQL:
String query = "select * from usiis.vw_patients where first_name=? and last_name=? and dob = to_date(?, 'yyyy-mm-dd')";
, но я продолжаю получать 'java.sql.SQLException: Неверное имя столбца' ошибка.Я попробовал тот же код на SQLDeveloper, и он работал нормально:
select * from usiis.vw_patients where first_name='BRINLEE' and last_name='DENNEY' and dob=TO_DATE('1998-06-13', 'YYYY-MM-DD');
, затем я удалил [and dob = to_date (?, 'yyyy-mm-dd') "] из строки запроса в моем приложениизапрос тоже работал нормально: String query = "select * from usiis.vw_patients, где first_name =?и last_name =?
, поэтому я решил, что проблема в том, что JDBCTemplate не может правильно обработать функцию to_date ().
Трудно поверить, что я не смог найти решение для важнойвопрос, как это весной загрузки.Я пытался найти его в течение долгого времени и не мог найти подобную проблему.может кто-нибудь помочь, пожалуйста ...
Spring boot: 2.0.2.RELEASE Java: 1.8 Oracle.jdbc7: 12.1.0 Oracle: 12.1.x
EX:
...
String query = "select * from usiis.vw_patients where first_name=? and last_name=? and dob = to_date(?, 'yyyy-mm-dd')";
Object[] queryArgsObj = usiisDBAccessPatientURI.getQueryArgsObj();
List<Common_UsiisReturnedRow> usiisReturnedRows = oracleTemplate.query
(query,
queryArgsObj,
new UsiisRowMapper());
Usiis DBAccess ... queryArgsObj: BRINLEE
Usiis DBAccess ... queryArgsObj: DENNEY
Usiis DBAccess ...queryArgsObj: 1998-06-13
class UsiisRowMapper implements RowMapper<Common_UsiisReturnedRow>
{
@Override
public Common_UsiisReturnedRow mapRow(ResultSet rs, int rowNum) throws SQLException {
Common_UsiisReturnedRow usiisRetRow = new Common_UsiisReturnedRow();
usiisRetRow.setFirst_name( (rs.getString("first_name")).trim() );
usiisRetRow.setLast_name( (rs.getString("last_name")).trim() );
usiisRetRow.setDob( rs.getDate("dob") );
usiisRetRow.setGender( (rs.getString("gender")).trim() );
usiisRetRow.setEth_code( (rs.getString("eth_code")).trim() );
usiisRetRow.setAddress_street( (rs.getString("address_street")).trim() );
usiisRetRow.setAddress_city( (rs.getString("address_city")).trim() );
usiisRetRow.setAddress_state( (rs.getString("address_state")).trim() );
usiisRetRow.setAddress_zip( (rs.getString("address_zip")).trim() );
usiisRetRow.setPhone_number( (rs.getString("phone_number")).trim() );
usiisRetRow.setVaccine_id( (rs.getInt("vaccine_id")) );
usiisRetRow.setVaccine_code( (rs.getInt("vaccine_code")) );
usiisRetRow.setVaccine_name( (rs.getString("vaccine_name")).trim() );
usiisRetRow.setVaccination_date( (rs.getString("vaccination_date")).trim() );
usiisRetRow.setDose_no( (rs.getInt("dose_no")) );
return usiisRetRow;
}
}
Я должен получить хотя бы один ряд пациентов, но вместо этого я получу:
2019-05-20 10:05: 06.706 ОШИБКА 7876 --- [nio-4007-exec-2] oaccC [. [. [/]. [DispatcherServlet]: Servlet.service () для сервлета [dispatcherServlet] в контексте с исключением пути [] выбросило [Обработка запросане удалось;вложенным исключением является org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback;плохая грамматика SQL [выберите * из usiis.vw_patients где first_name =?и фамилия =?и dob = to_date (?, 'гггг-мм-дд')];вложенным исключением является java.sql.SQLException: неверное имя столбца] с основной причиной
java.sql.SQLException: неверное имя столбца
at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:3965) ~[ojdbc7-12.1.0.jar:12.1.0.1.0]
at oracle.jdbc.driver.InsensitiveScrollableResultSet.findColumn(InsensitiveScrollableResultSet.java:299) ~[ojdbc7-12.1.0.jar:12.1.0.1.0]
at oracle.jdbc.driver.GeneratedResultSet.getInt(GeneratedResultSet.java:1350) ~[ojdbc7-12.1.0.jar:12.1.0.1.0]