diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapper.java b/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapper.java index 01e925fbba..3bba16c3ee 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapper.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapper.java @@ -450,27 +450,31 @@ public class DefaultRecordMapper implements RecordMapper constructor : constructors) { - Class[] parameterTypes = constructor.getParameterTypes(); + // argument length + // [#6598] Try prefixes first (for nested POJOs), and then field.length + // (for a flat POJO) + for (boolean supportsNesting : new boolean[] { true, false }) { + for (Constructor constructor : constructors) { + Class[] parameterTypes = constructor.getParameterTypes(); - // Match the first constructor by parameter length - if (parameterTypes.length == prefixes().size()) { + // Match the first constructor by parameter length + if (parameterTypes.length == (supportsNesting ? prefixes().size() : fields.length)) { - // [#4627] use parameter names from byte code if available - if (mapConstructorParameterNames) { - Parameter[] parameters = constructor.getParameters(); + // [#4627] use parameter names from byte code if available + if (mapConstructorParameterNames) { + Parameter[] parameters = constructor.getParameters(); - if (parameters != null && parameters.length > 0) - delegate = new ImmutablePOJOMapperWithParameterNames(constructor, collectParameterNames(parameters)); + if (parameters != null && parameters.length > 0) + delegate = new ImmutablePOJOMapperWithParameterNames(constructor, collectParameterNames(parameters)); + } + + + if (delegate == null) + delegate = new ImmutablePOJOMapper(constructor, parameterTypes, supportsNesting); + + return; } - - - if (delegate == null) - delegate = new ImmutablePOJOMapper(constructor, parameterTypes); - - return; } } @@ -891,7 +895,7 @@ public class DefaultRecordMapper implements RecordMapper>[] nestedMappedFields; private final RecordMapper[] nestedMappers; - public ImmutablePOJOMapper(Constructor constructor, Class[] parameterTypes) { + public ImmutablePOJOMapper(Constructor constructor, Class[] parameterTypes, boolean supportsNesting) { this.constructor = accessible(constructor); this.parameterTypes = parameterTypes; this.nestedMappedFields = new List[prefixes().size()]; @@ -902,37 +906,40 @@ public class DefaultRecordMapper implements RecordMapper(); + if (nestedIndexLookup[i] == null) + nestedIndexLookup[i] = new ArrayList<>(); + + nestedMappedFields[i].add(field( + name(fields[j].getName().substring(prefix.length() + 1)), + fields[j].getDataType() + )); + + nestedIndexLookup[i].add(j); + } } - else if (fields[j].getName().startsWith(prefix + ".")) { - hasNestedFields = true; - if (nestedMappedFields[i] == null) - nestedMappedFields[i] = new ArrayList<>(); - if (nestedIndexLookup[i] == null) - nestedIndexLookup[i] = new ArrayList<>(); - - nestedMappedFields[i].add(field( - name(fields[j].getName().substring(prefix.length() + 1)), - fields[j].getDataType() - )); - - nestedIndexLookup[i].add(j); + if (nestedMappedFields[i] != null) { + nestedMappers[i] = configuration + .recordMapperProvider() + .provide((RecordType) new Fields<>(nestedMappedFields[i]), parameterTypes[i]); } } - - if (nestedMappedFields[i] != null) { - nestedMappers[i] = configuration - .recordMapperProvider() - .provide((RecordType) new Fields<>(nestedMappedFields[i]), parameterTypes[i]); - } } this.nested = hasNestedFields;