2014-02-06 54 views
2

我有一個名爲'Load'的表有一個'load_starttime'類型的datetime的MS SQL DN。我的查詢試圖計算在特定日期插入的行數。我按照這個教程mapping a datetime via the jdbc templateJDBC模板:MS SQL日期時間列查詢

Date d = new Date("2014-02-06"); 
JdbcTemplate template = new JdbcTemplate(getDataSource()); 
int count = template.queryForInt(
    "SELECT COUNT(load_starttime) FROM Load WHERE load_starttime=:load_starttime", 
     new MapSqlParameterSource().addValue(
      "load_starttime", 
      new java.sql.Date(d.getTime()) 
     ), 
    Types.TIMESTAMP 
); 

我目前的例外是

org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [SELECT COUNT(load_starttime) FROM Load WHERE load_starttime=:load_starttime]; Unable to convert between org.springframework.jdbc.core.namedparam.MapSqlParameterSource and JAVA_OBJECT.; nested exception is java.sql.SQLException: Unable to convert between org.springframework.jdbc.core.namedparam.MapSqlParameterSource and JAVA_OBJECT. 
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:101) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603) 
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:637) 
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:666) 
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:674) 
at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:729) 
at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:745) 
at org.springframework.jdbc.core.JdbcTemplate.queryForInt(JdbcTemplate.java:776) 

第二部分

Caused by: java.sql.SQLException: Unable to convert between org.springframework.jdbc.core.namedparam.MapSqlParameterSource and JAVA_OBJECT. 
at net.sourceforge.jtds.jdbc.Support.convert(Support.java:446) 
at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.setObjectBase(JtdsPreparedStatement.java:370) 
at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.setObject(JtdsPreparedStatement.java:668) 
at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:365) 
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:217) 
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:145) 
at org.springframework.jdbc.core.ArgPreparedStatementSetter.doSetValue(ArgPreparedStatementSetter.java:65) 
at org.springframework.jdbc.core.ArgPreparedStatementSetter.setValues(ArgPreparedStatementSetter.java:46) 
at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:642) 
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587) 

回答

2

我認爲是由於。

JdbcTemplate template = new JdbcTemplate(getDataSource()); 

嘗試

NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(getDataSource()); 

的JdbcTemplate做它只能與工作?

的JdbcTemplate - 這是經典的春天JDBC方法和最廣泛的應用。這是「最低級別」方法,所有其他方法在封面下使用JdbcTemplate。在JDK 1.4及更高版本的環境中運行良好。

是NamedParameterJdbcTemplate - 包裝一個JdbcTemplate提供更方便的使用與命名參數代替傳統的JDBC 「?」佔位符。當您有一個SQL語句的多個參數時,這提供了更好的文檔和易用性 。適用於JDK 1.4及更高版本。

而這被認爲是一個已命名的參數* load_starttime =:load_starttime *

+0

這是否行得通? – Koitoer

0

JdbcTemplate類不支持命名參數。您必須爲此任務使用'NamedParameterJdbcTemplate'類。 請參閱下面的源代碼來做你想做的事:

final NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(dataSource); 
    final Date d = new Date("2014-02-06"); 
    int count = template.queryForObject(
      "SELECT COUNT(load_starttime) FROM Load WHERE load_starttime=:load_starttime", 
      new MapSqlParameterSource().addValue("load_starttime", new java.sql.Date(d.getTime())), 
      Integer.class 
    );