Oracle
 sql >> Base de données >  >> RDS >> Oracle

Spring JDBC BeanPropertyRowMapper oui non ('Y','N') aux propriétés booléennes du bean

Alors j'ai trouvé comment faire ça. J'ai étendu BeanPropertyRowMapper et les types booléens du gestionnaire via un code personnalisé avant de transférer le contrôle à beanpropertyrowmapper pour le reste des types de données.

Remarque :Cela fonctionne pour moi car j'utilise oracle et toutes les colonnes de type "booléen" sont des chaînes avec des valeurs de type "y", "oui", "n" et "non".

Ceux qui utilisent le format numérique 1,0 ou d'autres formats pourraient potentiellement l'améliorer davantage en le rendant générique via une carte objet oui et en obtenant des objets à partir du jeu de résultats et en les recherchant dans cette carte. J'espère que cela aidera quelqu'un d'autre dans une situation comme la mienne.

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);
    }
}