実装を見ると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);
}
JdbcUtils.getResultSetValueにgetColumnValue(rs, index, pd);
デリゲートする場所
のそのpd
フィールドgetColumnValue
は実際の「プロパティ記述子」であり、マップ先のフィールドのタイプとして( pd.getPropertyType()
) で使用されます。JdbcUtils
JdbcUtils
メソッドのコードを見ると、すべての標準型に一致するように、あるステートメントから別のステートメントにgetResultSetValue
単純に移行することがわかります。見つからない場合は、「標準」タイプではないため、以下に依存します。if
pd.getPropertyType()
DateTime
rs.getObject()
} else {
// Some unknown type desired -> rely on getObject.
次に、このオブジェクトが SQL Date の場合、それを に変換し、ドメインのフィールドにTimestamp
設定されるように戻ります => 失敗する場所。DateTime
Date
したがって、 / Timestamp
toDateTime
コンバーターをに挿入する簡単な方法はないようですBeanPropertyRowMapper
。そのため、独自の RowMapper を実装する方がクリーン (かつパフォーマンスが高い) でしょう。
コンソールでマッピング エラーを確認したい場合は、ロギング レベルorg.springframework.jdbc
を「デバッグ」または「トレース」に設定して、何が起こっているかを正確に確認してください。
私がテストしていないことの 1 つは、次のタイプ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) {}