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; }
@Override public RowMapper<JoinRow> specialize(ResultSet r, StatementContext ctx) throws SQLException { RowMapper<?>[] mappers = new RowMapper[types.length]; for (int i = 0; i < types.length; i++) { Type type = types[i]; mappers[i] = ctx.findRowMapperFor(type) .orElseThrow(() -> new IllegalArgumentException("No row mapper registered for " + type)) .specialize(r, ctx); } return (rs, context) -> { final Map<Type, Object> entries = new HashMap<>(types.length); for (int i = 0; i < types.length; i++) { Type type = types[i]; RowMapper<?> mapper = mappers[i]; entries.put(type, mapper.map(r, ctx)); } return new JoinRow(entries); }; }
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; }
@Override public JoinRow map(ResultSet r, StatementContext ctx) throws SQLException { final Map<Type, Object> entries = new HashMap<>(types.length); for (Type type : types) { entries.put(type, ctx.findRowMapperFor(type) .orElseThrow(() -> new IllegalArgumentException( "No row mapper registered for " + type)) .map(r, ctx)); } return new JoinRow(entries); }
/** * Maps this result set to a {@link ResultIterable} of the given element type. * * @param type the type to map the result set rows to * @return a {@link ResultIterable} of the given type. * @see Configurable#registerRowMapper(RowMapper) * @see Configurable#registerRowMapper(RowMapperFactory) * @see Configurable#registerColumnMapper(ColumnMapperFactory) * @see Configurable#registerColumnMapper(ColumnMapper) */ default ResultIterable<?> mapTo(Type type) { return mapResultSet((supplier, ctx) -> { RowMapper<?> mapper = ctx.findRowMapperFor(type) .orElseThrow(() -> new UnsupportedOperationException("No mapper registered for type " + type)); return ResultIterable.of(supplier, mapper, ctx); }); }
@Override public RowMapper<JoinRow> specialize(ResultSet r, StatementContext ctx) throws SQLException { RowMapper<?>[] mappers = new RowMapper[types.length]; for (int i = 0; i < types.length; i++) { Type type = types[i]; mappers[i] = ctx.findRowMapperFor(type) .orElseThrow(() -> new IllegalArgumentException("No row mapper registered for " + type)) .specialize(r, ctx); } return (rs, context) -> { final Map<Type, Object> entries = new HashMap<>(types.length); for (int i = 0; i < types.length; i++) { Type type = types[i]; RowMapper<?> mapper = mappers[i]; entries.put(type, mapper.map(r, ctx)); } return new JoinRow(entries); }; }
/** * 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") default Object collectInto(Type containerType) { return mapResultSet((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.findRowMapperFor(elementType) .orElseThrow(() -> new UnsupportedOperationException("No mapper registered for element type " + elementType)); return ResultIterable.of(rs, mapper, ctx).collect(collector); }); } }