diff --git a/src/main/java/io/ebeaninternal/server/dto/DtoMappingRequest.java b/src/main/java/io/ebeaninternal/server/dto/DtoMappingRequest.java index 1562c9961..b2a72db61 100644 --- a/src/main/java/io/ebeaninternal/server/dto/DtoMappingRequest.java +++ b/src/main/java/io/ebeaninternal/server/dto/DtoMappingRequest.java @@ -50,4 +50,45 @@ public class DtoMappingRequest { public QueryPlanMetric createMetric() { return MetricFactory.get().createQueryPlanMetric(type, label, profileLocation, sql); } + + /** + * Map all DB columns to setters. + */ + DtoReadSet[] mapSetters(DtoMeta meta) { + DtoReadSet[] setterProps = new DtoReadSet[columnMeta.length]; + for (int i = 0; i < columnMeta.length; i++) { + setterProps[i] = mapColumn(i, meta); + } + return setterProps; + } + + /** + * Map DB columns after constructor to setters. + */ + DtoReadSet[] mapArgPlusSetters(DtoMeta meta, int firstOnes) { + DtoReadSet[] setterProps = new DtoReadSet[columnMeta.length - firstOnes]; + int pos = 0; + for (int i = firstOnes; i < columnMeta.length; i++) { + setterProps[pos++] = mapColumn(i, meta); + } + return setterProps; + } + + private DtoReadSet mapColumn(int pos, DtoMeta meta) { + String label = columnMeta[pos].getLabel(); + DtoReadSet property = meta.findProperty(label); + if (property == null || property.isReadOnly()) { + if (isRelaxedMode()) { + property = DtoReadSetColumnSkip.INSTANCE; + } else { + throw new IllegalStateException(unableToMapColumnMessage(columnMeta[pos], meta)); + } + } + return property; + } + + private String unableToMapColumnMessage(DtoColumn col, DtoMeta meta) { + return "Unable to map DB column " + col + " to a property with a setter method on " + meta.dtoType()+". Consider query.setRelaxedMode() to skip mapping this column."; + } + } diff --git a/src/main/java/io/ebeaninternal/server/dto/DtoMeta.java b/src/main/java/io/ebeaninternal/server/dto/DtoMeta.java index a6c99cb43..98ee734d9 100644 --- a/src/main/java/io/ebeaninternal/server/dto/DtoMeta.java +++ b/src/main/java/io/ebeaninternal/server/dto/DtoMeta.java @@ -72,59 +72,16 @@ class DtoMeta { } private DtoQueryPlanConPlus matchMaxArgPlusSetters(DtoMappingRequest request) { - - - int firstOnes = maxArgConstructor.getArgCount(); - - DtoColumn[] cols = request.getColumnMeta(); - - DtoReadSet[] setterProps = new DtoReadSet[cols.length - firstOnes]; - - int pos = 0; - for (int i = firstOnes; i < cols.length; i++) { - String label = cols[i].getLabel(); - DtoReadSet property = findProperty(label); - if (property == null || property.isReadOnly()) { - if (request.isRelaxedMode()) { - property = DtoReadSetColumnSkip.INSTANCE; - } else { - throw new IllegalStateException(unableToMapColumnMessage(cols[i])); - } - } - setterProps[pos++] = property; - } - + DtoReadSet[] setterProps = request.mapArgPlusSetters(this, maxArgConstructor.getArgCount()); return new DtoQueryPlanConPlus(request, maxArgConstructor, setterProps); } - private String unableToMapColumnMessage(DtoColumn col) { - return "Unable to map DB column " + col + " to a property with a setter method on " + dtoType+". Consider query.setRelaxedMode() to skip mapping this column."; - } - private DtoQueryPlan matchSetters(DtoMappingRequest request) { - - DtoColumn[] cols = request.getColumnMeta(); - - DtoReadSet[] setterProps = new DtoReadSet[cols.length]; - - for (int i = 0; i < cols.length; i++) { - String label = cols[i].getLabel(); - DtoReadSet property = findProperty(label); - if (property == null || property.isReadOnly()) { - if (request.isRelaxedMode()) { - property = DtoReadSetColumnSkip.INSTANCE; - } else { - throw new IllegalStateException(unableToMapColumnMessage(cols[i])); - } - } - setterProps[i] = property; - } - + DtoReadSet[] setterProps = request.mapSetters(this); return new DtoQueryPlanConSetter(request, defaultConstructor, setterProps); } - private DtoReadSet findProperty(String label) { - + DtoReadSet findProperty(String label) { String upperLabel = label.toUpperCase(); DtoMetaProperty property = propMap.get(upperLabel); if (property == null && upperLabel.startsWith("IS_")) { @@ -135,4 +92,8 @@ class DtoMeta { } return property; } + + Class dtoType() { + return dtoType; + } }