我正在使用JDBCTemplate从Oracle数据库获取数据的微服务Spring Boot 2应用程序。

我尝试了以下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');


然后我从应用程序中的查询字符串中删除了[和dob = to_date(?,'yyyy-mm-dd')“],该查询也可以正常工作:
字符串查询=“从usiis.vw_ Patients中选择*,其中first_name =?和last_name =?

所以我认为问题是JDBCTemplate无法正确处理to_date()函数。

很难相信我在春季启动中找不到像这样的重要问题的解决方案。我尝试使用Google搜索了很长时间,但找不到类似的问题。
谁能帮忙...

春季启动:2.0.2.RELEASE
爪哇:1.8
Oracle.jdbc7:12.1.0
甲骨文:12.1.x

例如:

...
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 [dispatcherServlet]的Servlet.service()路径[]引发异常[请求处理失败;嵌套的异常是org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback;错误的SQL语法[从usiis.vw_ Patients中选择*,其中first_name =?和last_name =?和dob = to_date(?,'yyyy-mm-dd')];嵌套的异常是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]

最佳答案

问题解决了。我只是再次重新下载了Oracle jdbc7 jar文件,它起作用了。谢谢大家和我一起看这个问题。
实际上,我担心在与JDBCTemplate结合使用的jdbc7中,oracle函数无法正常工作。我很高兴事实并非如此。

07-24 09:38