StoredResultSetRowMapper.java
package com.github.mygreen.sqlmapper.core.mapper;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Optional;
import org.springframework.beans.BeanUtils;
import org.springframework.jdbc.core.RowMapper;
import com.github.mygreen.sqlmapper.core.meta.PropertyMeta;
import com.github.mygreen.sqlmapper.core.meta.PropertyValueInvoker;
import com.github.mygreen.sqlmapper.core.meta.StoredPropertyMeta;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* ストアドプロシージャ/ファンクションのResultSetをBeanにマッピングします。
*
*
* @since 0.3
* @param <T> マッピング先のクラスタイプ
*
* @author T.TSUCHIE
*/
@Slf4j
@RequiredArgsConstructor
public class StoredResultSetRowMapper<T> implements RowMapper<T> {
private final StoredPropertyMeta propertyMeta;
@SuppressWarnings("unchecked")
@Override
public T mapRow(final ResultSet rs, final int rowNum) throws SQLException {
// マッピングするエンティティのインスタンスの準備
final T bean = BeanUtils.instantiateClass((Class<T>)propertyMeta.getComponentType().get());
final ResultSetMetaData rsmd = rs.getMetaData();
final int columnCount = rsmd.getColumnCount();
for(int i=0; i < columnCount; i++) {
String columnName = rsmd.getColumnName(i+1);
Optional<PropertyMeta> nestedPropertyMeta = propertyMeta.findNestedColumnPropertyMeta(columnName);
if(nestedPropertyMeta.isEmpty()) {
if(log.isDebugEnabled()) {
log.debug("not found nestedPropertyMeta for column name '{}' in {}.", columnName, propertyMeta.getDeclaringClass().getSimpleName());
}
continue;
}
Object propertyValue = nestedPropertyMeta.get().getValueType().getValue(rs, i+1);
PropertyValueInvoker.setEmbeddedPropertyValue(nestedPropertyMeta.get(), bean, propertyValue);
}
return bean;
}
}