sql >> Base de Datos >  >> RDS >> Oracle

Spring JDBC BeanPropertyRowMapper sí no ('Y', 'N') a propiedades booleanas de bean

Así que descubrí cómo hacer esto. Extendí BeanPropertyRowMapper y maneje los tipos booleanos a través de un código personalizado antes de entregar el control a beanpropertyrowmapper para el resto de los tipos de datos.

Nota:A mí me funciona porque uso Oracle y todas las columnas de tipo 'booleano' son cadenas con valores de tipo 'y', 'sí', 'n' y 'no'.

Aquellos que usan numérico 1,0 u otros formatos podrían mejorarlo aún más haciéndolo genérico a través de un mapa de objetos sí y obteniendo objetos del conjunto de resultados y buscándolos en este mapa. Espero que esto ayude a alguien más en una situación como la mía.

import java.beans.PropertyDescriptor;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;

/**
 * Extends BeanPropertyRowMapper to allow for boolean fields
 * mapped to 'Y,'N' type column to get set correctly. Using stock BeanPropertyRowMapper
 * would throw a SQLException.
 * 
 */
public class ExtendedBeanPropertyRowMapper<T> extends BeanPropertyRowMapper<T> {

    //Contains valid true values
    public static final Set<String> TRUE_SET = new HashSet<String>(Arrays.asList("y", "yes", "true"));

    public ExtendedBeanPropertyRowMapper(Class<T> class1) {
        super(class1);
    }

    @Override
    /**
     * Override <code>getColumnValue</code> to add ability to map 'Y','N' type columns to
     * boolean properties.
     * 
     * @param rs is the ResultSet holding the data
     * @param index is the column index
     * @param pd the bean property that each result object is expected to match
     * (or <code>null</code> if none specified)
     * @return the Object value
     * @throws SQLException in case of extraction failure
     * @see org.springframework.jdbc.core.BeanPropertyRowMapper#getColumnValue(java.sql.ResultSet, int, PropertyDescriptor) 
     */
    protected Object getColumnValue(ResultSet rs, int index,
            PropertyDescriptor pd) throws SQLException {
        Class<?> requiredType = pd.getPropertyType();
        if (boolean.class.equals(requiredType) || Boolean.class.equals(requiredType)) {
            String stringValue = rs.getString(index);
            if(!StringUtils.isEmpty(stringValue) && TRUE_SET.contains(stringValue.toLowerCase())){
                return true;
            }
            else return false;
        }       
        return super.getColumnValue(rs, index, pd);
    }
}