Search in sources :

Example 6 with ConverterException

use of org.sql2o.converters.ConverterException in project sql2o by aaberg.

the class DefaultResultSetHandlerFactory method getSetter.

@SuppressWarnings("unchecked")
private static Setter getSetter(final Quirks quirks, final String propertyPath, final PojoMetadata metadata) {
    int index = propertyPath.indexOf('.');
    if (index <= 0) {
        // Simple path - fast way
        final Setter setter = metadata.getPropertySetterIfExists(propertyPath);
        // behavior change: do not throw if POJO contains less properties
        if (setter == null)
            return null;
        final Converter converter = quirks.converterOf(setter.getType());
        // setter without converter
        if (converter == null)
            return setter;
        return new Setter() {

            public void setProperty(Object obj, Object value) {
                try {
                    setter.setProperty(obj, converter.convert(value));
                } catch (ConverterException e) {
                    throw new Sql2oException("Error trying to convert column " + propertyPath + " to type " + setter.getType(), e);
                }
            }

            public Class getType() {
                return setter.getType();
            }
        };
    }
    // TODO: rewrite, get rid of POJO class
    return new Setter() {

        public void setProperty(Object obj, Object value) {
            Pojo pojo = new Pojo(metadata, metadata.isCaseSensitive(), obj);
            pojo.setProperty(propertyPath, value, quirks);
        }

        public Class getType() {
            // doesn't used anyway
            return Object.class;
        }
    };
}
Also used : ConverterException(org.sql2o.converters.ConverterException) Pojo(org.sql2o.reflection.Pojo) Setter(org.sql2o.reflection.Setter) Converter(org.sql2o.converters.Converter)

Example 7 with ConverterException

use of org.sql2o.converters.ConverterException in project sql2o by aaberg.

the class DefaultResultSetHandlerFactory method newResultSetHandler0.

@SuppressWarnings("unchecked")
private ResultSetHandler<T> newResultSetHandler0(final ResultSetMetaData meta) throws SQLException {
    final Getter[] getters;
    final Setter[] setters;
    final Converter converter;
    final boolean useExecuteScalar;
    // TODO: it's possible to cache converter/setters/getters
    // cache key is ResultSetMetadata + Bean type
    converter = quirks.converterOf(metadata.getType());
    final int columnCount = meta.getColumnCount();
    // getters[0] is always null
    getters = new Getter[columnCount + 1];
    for (int i = 1; i <= columnCount; i++) {
        String colName = quirks.getColumnName(meta, i);
        // behavior change: do not throw if POJO contains less properties
        getters[i] = getGetter(quirks, colName, metadata);
        // and the getter doesn't exist, throw exception.
        if (this.metadata.throwOnMappingFailure && getters[i] == null && columnCount > 1) {
            throw new Sql2oException("Could not map " + colName + " to any property.");
        }
    }
    // setters[0] is always null
    setters = new Setter[columnCount + 1];
    for (int i = 1; i <= columnCount; i++) {
        String colName = quirks.getColumnName(meta, i);
        setters[i] = getSetter(quirks, colName, metadata);
        // and the setter doesn't exist, throw exception.
        if (this.metadata.throwOnMappingFailure && setters[i] == null && columnCount > 1) {
            throw new Sql2oException("Could not map " + colName + " to any property.");
        }
    }
    /**
     * Fallback to executeScalar if converter exists,
     * we're selecting 1 column, and no property setter exists for the column.
     */
    useExecuteScalar = converter != null && columnCount == 1 && setters[1] == null;
    return new ResultSetHandler<T>() {

        @SuppressWarnings("unchecked")
        public T handle(ResultSet resultSet) throws SQLException {
            if (useExecuteScalar) {
                try {
                    return (T) converter.convert(quirks.getRSVal(resultSet, 1));
                } catch (ConverterException e) {
                    throw new Sql2oException("Error occurred while converting value from database to type " + metadata.getType(), e);
                }
            }
            // otherwise we want executeAndFetch with object mapping
            Object pojo = metadata.getObjectConstructor().newInstance();
            for (int colIdx = 1; colIdx <= columnCount; colIdx++) {
                Setter setter = setters[colIdx];
                if (setter == null)
                    continue;
                setter.setProperty(pojo, quirks.getRSVal(resultSet, colIdx));
            }
            return (T) pojo;
        }
    };
}
Also used : ConverterException(org.sql2o.converters.ConverterException) Getter(org.sql2o.reflection.Getter) Setter(org.sql2o.reflection.Setter) ResultSet(java.sql.ResultSet) Converter(org.sql2o.converters.Converter)

Aggregations

ConverterException (org.sql2o.converters.ConverterException)7 Converter (org.sql2o.converters.Converter)5 Sql2oException (org.sql2o.Sql2oException)2 Quirks (org.sql2o.quirks.Quirks)2 Getter (org.sql2o.reflection.Getter)2 Pojo (org.sql2o.reflection.Pojo)2 Setter (org.sql2o.reflection.Setter)2 ResultSet (java.sql.ResultSet)1 ArrayList (java.util.ArrayList)1