JDBCTemplate无法处理to_date()。它给出了一个例外:无效的列名

时间:2019-05-20 16:46:54

标签: java oracle spring-boot jdbc jdbctemplate

我正在使用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:Invalid column name'错误。 我在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')“],该查询也可以正常工作: 字符串查询=“从usiis.vw_ Patients中选择*,其中first_name =?和last_name =?

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

很难相信我无法在Spring Boot中找到诸如此类的重要问题的解决方案。我尝试使用谷歌搜索了很长时间,却找不到类似的问题。 谁能帮忙...

春季启动:2.0.2.RELEASE 爪哇:1.8 Oracle.jdbc7:12.1.0 甲骨文: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 [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]

1 个答案:

答案 0 :(得分:0)

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