java - JDBCTemplate 无法处理 to_date()。它给出了异常 : Invalid column name

标签 java oracle spring-boot jdbc jdbctemplate

我正在开发一个微服务 Spring Boot 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')"] ,查询也运行良好: 字符串查询=“从usiis.vw_患者中选择*,其中first_name =?和last_name =?

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

很难相信我在 Spring Boot 中找不到这样的重要问题的解决方案。我尝试谷歌搜索很长时间,但没有找到类似的问题。 任何人都可以帮忙吗...

Spring 启动:2.0.2.RELEASE java :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
使用 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] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] 在路径 [] 的上下文中抛出异常 [请求处理失败;嵌套异常是org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback;错误的 SQL 语法 [select * from usiis.vw_ Patients where first_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 文件,它就工作了。谢谢大家和我一起看这个问题。 实际上,我担心在jdbc7中与JDBCTemplate结合的oracle功能不起作用。我很高兴事实并非如此。

关于java - JDBCTemplate 无法处理 to_date()。它给出了异常 : Invalid column name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56225112/

相关文章:

java - Eclipse Mars + lombok + 保存操作

java - WindowIconfield 和 FocusLost 不能一起使用

java - 避免算法中的浮点精度误差

database - 系统表上的 Oracle 闪回

oracle - 未传递输入参数中的 PLSQL 特殊字符

java - Spring Boot Hibernate 将枚举集映射到 boolean 列

java - 单选按钮标签更改

java - 在 Log4j2 中扩展 PatternLayout

sql - Oracle 11g - 为什么 SELECT COUNT(*) 比 SELECT * 慢无限?

java - Orika 在使用嵌入式 tomcat 的情况下使用了错误的类加载器