看着BeanPropertyRowMapper
實現,它設置的字段的方法是:
Object value = getColumnValue(rs, index, pd);
if (logger.isDebugEnabled() && rowNumber == 0) {
logger.debug("Mapping column '" + column + "' to property '" +
pd.getName() + "' of type " + pd.getPropertyType());
}
try {
bw.setPropertyValue(pd.getName(), value);
}
其中getColumnValue(rs, index, pd);
委託給JdbcUtils.getResultSetValue
,在getColumnValue
pd
字段是實際的「p roperty d escriptor 「,即JdbcUtils
使用(pd.getPropertyType()
)作爲類型要映射到的字段。
如果你看一下JdbcUtils
代碼getResultSetValue
方法,你會看到,它只是從一個if
語句去另一個,匹配pd.getPropertyType()
所有標準的類型。如果它沒有找到一個,因爲DateTime
是不是一個「標準」型,它依賴於rs.getObject()
:
} else {
// Some unknown type desired -> rely on getObject.
那麼如果這個對象是將其轉換爲Timestamp
一個SQL日期,並返回到設置到您的域的DateTime
字段=>失敗。
因此,似乎沒有被注入一個Date
/Timestamp
到DateTime
轉換器轉換成BeanPropertyRowMapper
一個直接的方式。所以它會更乾淨(更高性能)來實現你自己的RowMapper。
如果您想在控制檯中看到映射錯誤,請將日誌記錄級別設置爲org.springframework.jdbc
以「調試」或更好的「跟蹤」來查看發生了什麼。
有一兩件事你可以試試,我沒有測試過,是延長一個BeanPropertyRowMapper
和覆蓋DateTime
類型的屬性:
/**
* Initialize the given BeanWrapper to be used for row mapping.
* To be called for each row.
* <p>The default implementation is empty. Can be overridden in subclasses.
* @param bw the BeanWrapper to initialize
*/
protected void initBeanWrapper(BeanWrapper bw) {}
這正是我要找的。但是,它並不真正爲我工作。執行在DateTime映射發生時停止,但不記錄錯誤:'DEBUG:com.keype.hawk.system.jdbc.support.HawkBeanPropertyRowMapper [mapRow]:將'date_added'列映射到class org類型的屬性'dateAdded'。 joda.time.DateTime' –
最後管理到問題區域。 setValue()被一個TimeStamp對象作爲參數調用,但它實際上是一個JodaTime每個我的記錄器:'Un支持的對象2011-10-12 00:00:00.0。對象類型:java.sql.Timestamp。期望日期時間' –
@firdousamir好的,我現在更改了代碼。試試這個版本。 –