Вы можете написать пользовательский TypeHanlder
, который расширяет BaseTypeHandler
, что даст вам доступ к ResultSetMetaData
.Ранее я написал такой обработчик для преобразования Date
в LocalDate
.Это немного похоже на ваш ответ, потому что маппер не будет напрямую возвращать List<Map<String, Object>>
, но это может быть свойство возвращаемого вами объекта.
@MappedTypes(LocalDate.class)
public class DbLocalDateTypeHandler extends BaseTypeHandler<LocalDate> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, LocalDate parameter, JdbcType jdbcType) throws SQLException {
if (parameter == null) {
ps.setDate(i, null);
} else {
ps.setDate(i, Date.valueOf(parameter));
}
}
@Override
public LocalDate getNullableResult(ResultSet rs, String columnName) throws SQLException {
Date date = rs.getDate(columnName);
if (date != null) {
return date.toLocalDate();
}
return null;
}
@Override
public LocalDate getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
Date date = rs.getDate(columnIndex);
if (date != null) {
return date.toLocalDate();
}
return null;
}
@Override
public LocalDate getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
Date date = cs.getDate(columnIndex);
if (date != null) {
return date.toLocalDate();
}
return null;
}
}
Тогда в вашем resultMap
вам просто нужно сослаться на этот обработчик:
<result column="CREATE_DATE" jdbcType="DATE" property="createDate" typeHandler="com.company.core.framework.db.DbLocalDateTypeHandler"/>
Наконец, если вам не нужен ResultSetMetaData
, вы можете заняться созданием пользовательскогоObjectFactory
.
например, Как вернуть необязательный запрос из MyBatis
Полезные документы MyBatis:
http://www.mybatis.org/mybatis-3/configuration.html#typeHandlers
http://www.mybatis.org/mybatis-3/configuration.html#objectFactory