Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Spring JDBC BeanPropertyRowMapper ja nein ('Y','N') zu booleschen Bean-Eigenschaften

Also habe ich herausgefunden, wie man das macht. Ich habe BeanPropertyRowMapper und Handler-Boolean-Typen durch benutzerdefinierten Code erweitert, bevor ich die Kontrolle für die restlichen Datentypen an BeanPropertyrowmapper übergeben habe.

Hinweis:Es funktioniert für mich, weil ich Oracle verwende und alle Spalten vom Typ "boolean" Zeichenfolgen mit Werten vom Typ "y", "yes", "n" und "no" sind.

Diejenigen, die das numerische 1,0 oder andere Formate verwenden, könnten es möglicherweise weiter verbessern, indem sie es durch eine Objekt-Ja-Karte generisch machen und Objekte aus der Ergebnismenge abrufen und in dieser Karte nachschlagen. Hoffe, das hilft jemand anderem in einer Situation wie meiner.

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