private ColumnMapper<?> columnMapperFor(Type type) { return columnMappers.computeIfAbsent(type, t -> ctx.findColumnMapperFor(t) .orElseThrow(() -> new NoSuchMapperException("No column mapper registered for " + t))); } }
@SuppressWarnings("unchecked") @Override public Optional<T> map(ResultSet r, int columnNumber, StatementContext ctx) throws SQLException { final ColumnMapper<?> mapper = ctx.findColumnMapperFor( GenericTypes.findGenericParameter(type, Optional.class) .orElseThrow(() -> new NoSuchMapperException("No mapper for raw Optional type"))) .orElseThrow(() -> new NoSuchMapperException("No mapper for type " + type + " nested in Optional")); return (Optional<T>) Optional.ofNullable(mapper.map(r, columnNumber, ctx)); } }
private RowMapper<?> rowMapperFor(Type type) throws SQLException { if (rowMappers.containsKey(type)) { return rowMappers.get(type); } RowMapper<?> mapper = ctx.findRowMapperFor(type) .orElseThrow(() -> new NoSuchMapperException("No row mapper registered for " + type)) .specialize(rs, ctx); rowMappers.put(type, mapper); return mapper; }
private ColumnMapper<?> defaultColumnMapper(PojoProperty<T> property) { if (strictColumnTypeMapping) { throw new NoSuchMapperException(String.format( "Couldn't find mapper for property '%s' of type '%s' from %s", property.getName(), property.getQualifiedType(), type)); } return (r, n, c) -> r.getObject(n); }
static ColumnMapperFactory factory() { return (type, config) -> { Class<?> rawType = getErasedType(type); if (rawType == Option.class) { final Type nestedType = GenericTypes.findGenericParameter(type, Option.class) .orElseThrow(() -> new NoSuchMapperException("No mapper for raw Option type")); return Optional.of(new VavrOptionMapper<>(nestedType)); } return Optional.empty(); }; }
@SuppressWarnings("unchecked") @Override public Option<T> map(ResultSet r, int columnNumber, StatementContext ctx) throws SQLException { final ColumnMapper<?> mapper = ctx.findColumnMapperFor(nestedType) .orElseThrow(() -> new NoSuchMapperException("No mapper for type " + nestedType + " nested in Option")); return (Option<T>) Option.of(mapper.map(r, columnNumber, ctx)); }
private static RowMapper<?> getValueMapper(Type valueType, ConfigRegistry config) { String column = config.get(MapEntryMappers.class).getValueColumn(); if (column == null) { return config.get(RowMappers.class) .findFor(valueType) .orElseThrow(() -> new NoSuchMapperException("No row mapper registered for map value " + valueType)); } else { return config.get(ColumnMappers.class) .findFor(valueType) .map(mapper -> new SingleColumnMapper<>(mapper, column)) .orElseThrow(() -> new NoSuchMapperException("No column mapper registered for map value " + valueType + " in column " + column)); } }
private static RowMapper<?> getKeyMapper(Type keyType, ConfigRegistry config) { String column = config.get(MapEntryMappers.class).getKeyColumn(); if (column == null) { return config.get(RowMappers.class) .findFor(keyType) .orElseThrow(() -> new NoSuchMapperException("No row mapper registered for map key " + keyType)); } else { return config.get(ColumnMappers.class) .findFor(keyType) .map(mapper -> new SingleColumnMapper<>(mapper, column)) .orElseThrow(() -> new NoSuchMapperException("No column mapper registered for map key " + keyType + " in column " + column)); } }
QualifiedType<?> memberType = member.getQualifiedType(); ColumnMapper<?> columnMapper = ctx.findColumnMapperFor(memberType) .orElseThrow(() -> new NoSuchMapperException("No column mapper for " + memberType));
/** * Maps this result set to a {@link ResultIterable} of the given qualified element type. * * @param type the qualified type to map the result set rows to * @return a {@link ResultIterable} of the given type. * @see Configurable#registerRowMapper(RowMapper) * @see Configurable#registerRowMapper(org.jdbi.v3.core.mapper.RowMapperFactory) * @see Configurable#registerColumnMapper(org.jdbi.v3.core.mapper.ColumnMapperFactory) * @see Configurable#registerColumnMapper(ColumnMapper) */ @Beta default <T> ResultIterable<T> mapTo(QualifiedType<T> type) { return scanResultSet((supplier, ctx) -> { RowMapper<T> mapper = ctx.findMapperFor(type) .orElseThrow(() -> new NoSuchMapperException("No mapper registered for type " + type)); return ResultIterable.of(supplier, mapper, ctx); }); }
/** * Collect the results into a container of the given type. A collector * must be registered for the container type, which knows the element type * for the container. A mapper must be registered for the element type. * <p> * This method is equivalent to {@code ResultBearing.mapTo(elementType).collect(containerCollector)}. * </p> * * @param containerType the container type into which results will be collected * @return a container into which result rows have been collected */ @SuppressWarnings({ "unchecked", "rawtypes" }) default Object collectInto(Type containerType) { return scanResultSet((rs, ctx) -> { Collector collector = ctx.findCollectorFor(containerType) .orElseThrow(() -> new NoSuchCollectorException("No collector registered for container type " + containerType)); Type elementType = ctx.findElementTypeFor(containerType) .orElseThrow(() -> new ElementTypeNotFoundException("Unknown element type for container type " + containerType)); RowMapper<?> mapper = ctx.findMapperFor(elementType) .orElseThrow(() -> new NoSuchMapperException("No mapper registered for element type " + elementType)); return ResultIterable.of(rs, mapper, ctx).collect(collector); }); } }
throw new NoSuchMapperException(type + " cannot be mapped. " + "If tuple columns are configured (TupleMappers config class), " + "each tuple entry must be mappable via " throw new NoSuchMapperException(type + " cannot be mapped. " + "All tuple elements must be mappable by ColumnMapper or all by RowMapper. " + "If you want to mix column- and rowmapped entries, you must configure "
private ColumnMapper<?> columnMapperFor(Type type) { return columnMappers.computeIfAbsent(type, t -> ctx.findColumnMapperFor(t) .orElseThrow(() -> new NoSuchMapperException("No column mapper registered for " + t))); } }
private RowMapper<?> rowMapperFor(Type type) throws SQLException { if (rowMappers.containsKey(type)) { return rowMappers.get(type); } RowMapper<?> mapper = ctx.findRowMapperFor(type) .orElseThrow(() -> new NoSuchMapperException("No row mapper registered for " + type)) .specialize(rs, ctx); rowMappers.put(type, mapper); return mapper; }
private static RowMapper<?> getKeyMapper(Type keyType, ConfigRegistry config) { String column = config.get(MapEntryMappers.class).getKeyColumn(); if (column == null) { return config.get(RowMappers.class) .findFor(keyType) .orElseThrow(() -> new NoSuchMapperException("No row mapper registered for map key " + keyType)); } else { return config.get(ColumnMappers.class) .findFor(keyType) .map(mapper -> new SingleColumnMapper<>(mapper, column)) .orElseThrow(() -> new NoSuchMapperException("No column mapper registered for map key " + keyType + " in column " + column)); } }
private static RowMapper<?> getValueMapper(Type valueType, ConfigRegistry config) { String column = config.get(MapEntryMappers.class).getValueColumn(); if (column == null) { return config.get(RowMappers.class) .findFor(valueType) .orElseThrow(() -> new NoSuchMapperException("No row mapper registered for map value " + valueType)); } else { return config.get(ColumnMappers.class) .findFor(valueType) .map(mapper -> new SingleColumnMapper<>(mapper, column)) .orElseThrow(() -> new NoSuchMapperException("No column mapper registered for map value " + valueType + " in column " + column)); } }