查看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
in 中的那个pd
字段getColumnValue
是实际的“ p roperty d escriptor”,它在 ( pd.getPropertyType()
) 中JdbcUtils
用作要映射到的字段类型。
如果您查看方法的JdbcUtils
代码getResultSetValue
,您会发现它只是从一个if
语句到另一个语句,以匹配pd.getPropertyType()
所有标准类型。当它找不到时,由于DateTime
不是“标准”类型,它依赖于rs.getObject()
:
} else {
// Some unknown type desired -> rely on getObject.
然后,如果此对象是 SQL Date ,则它将其转换为 a Timestamp
,并返回设置为DateTime
您的域 => 失败的字段。
因此,似乎没有直接的方法将Date
/Timestamp
到DateTime
转换器注入到BeanPropertyRowMapper
. 因此,实现您自己的 RowMapper 会更简洁(并且性能更高)。
如果您想在控制台中查看映射错误,请将您的日志记录级别设置org.springframework.jdbc
为“调试”或更好的“跟踪”以查看究竟发生了什么。
您可以尝试的一件事,我没有测试过,是扩展 aBeanPropertyRowMapper
并覆盖DateTime
类型 in 的属性:
/**
* 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) {}