Spring Jdbc将java.sql.timestamp绑定到oracle日期问题

时间:2014-04-21 19:13:40

标签: java sql spring oracle jdbc

我目前正在使用Spring的NamedParameterJdbcTemplate将一些值注入到sql中。当我将两个java.sql.Timestamp值注入到oracle列的类型为DATE且正在执行的sql中时,我遇到了性能问题。

它非常慢(大约4分钟),但是当我通过sql developer运行它时,它在不到一秒的时间内执行,因为我在DATE列上有一个索引。这是我的调试日志的片段:

select * from test_table.test_column where eventts >= :startDate and eventts <= :endDate and loginname= :loginname and channelind= :channelind
2014-04-21 15:02:50 48416 [http-8080-1] DEBUG org.springframework.jdbc.core.JdbcTemplate  - Executing prepared SQL query
2014-04-21 15:02:50 48417 [http-8080-1] DEBUG org.springframework.jdbc.core.JdbcTemplate  - Executing prepared SQL statement [select * from test_table.test_column where eventts >= ? and eventts <= ? and loginname= ? and channelind= ?]
2014-04-21 15:02:50 48417 [http-8080-1] DEBUG org.springframework.jdbc.datasource.DataSourceUtils  - Fetching JDBC Connection from DataSource
2014-04-21 15:02:50 48438 [http-8080-1] DEBUG org.springframework.jdbc.core.StatementCreatorUtils  - Setting SQL statement parameter value: column index 1, parameter value [2014-04-21 12:02:38.0], value class [java.sql.Timestamp], SQL type 93
2014-04-21 15:02:50 48439 [http-8080-1] DEBUG org.springframework.jdbc.core.StatementCreatorUtils  - Setting SQL statement parameter value: column index 2, parameter value [2014-04-22 00:00:00.0], value class [java.sql.Timestamp], SQL type 93
2014-04-21 15:02:50 48439 [http-8080-1] DEBUG org.springframework.jdbc.core.StatementCreatorUtils  - Setting SQL statement parameter value: column index 3, parameter value [MY_LOGIN], value class [java.lang.String], SQL type unknown
2014-04-21 15:02:50 48439 [http-8080-1] DEBUG org.springframework.jdbc.core.StatementCreatorUtils  - Setting SQL statement parameter value: column index 4, parameter value [WEB], value class [java.lang.String], SQL type unknown

我在这里缺少什么? Oracle是否将值转换为TIMESTAMP,导致我在“eventts”DATE列上丢失了索引?

1 个答案:

答案 0 :(得分:0)

我认为你的猜测是正确的。 当你有

select something from some_table where column1 = :val1

和va1与column1的类型不同,Oracle会这样做:

select something from some_table where to_val1type(column1) = :val1

函数to_val1type不存在,它将由上下文决定(TO_DATE,TO_NUMBER等)。

要么使你的参数属于同一类型,要么自己使用TO_XXX fuctnion。