diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java index 3224f512ae..61c9df7f27 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java @@ -76,6 +76,7 @@ abstract class AbstractGenerator implements Generator { boolean generateRecords = true; boolean generateRecordsImplementingRecordN = true; boolean generateRecordToPojoMappers = true; + boolean generateRecordFromPojoUnmappers = true; boolean generatePojos = false; boolean generatePojosEqualsAndHashCode = false; boolean generatePojosToString = true; @@ -400,6 +401,16 @@ abstract class AbstractGenerator implements Generator { this.generateRecordToPojoMappers = generateRecordToPojoMappers; } + @Override + public boolean generateRecordFromPojoUnmappers() { + return generateRecords() && generatePojos() && generateRecordFromPojoUnmappers; + } + + @Override + public void setGenerateRecordFromPojoUnmappers(boolean generateRecordFromPojoUnmappers) { + this.generateRecordFromPojoUnmappers = generateRecordFromPojoUnmappers; + } + @Override public boolean generatePojos() { diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java index d2d8a5c0c0..cff66294b7 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java @@ -670,6 +670,8 @@ public class GenerationTool { generator.setGenerateRecordsImplementingRecordN(g.getGenerate().isRecordsImplementingRecordN()); if (g.getGenerate().isRecordToPojoMappers() != null) generator.setGenerateRecordToPojoMappers(g.getGenerate().isRecordToPojoMappers()); + if (g.getGenerate().isRecordFromPojoUnmappers() != null) + generator.setGenerateRecordFromPojoUnmappers(g.getGenerate().isRecordFromPojoUnmappers()); if (g.getGenerate().isPojos() != null) generator.setGeneratePojos(g.getGenerate().isPojos()); if (g.getGenerate().isImmutablePojos() != null) diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java index a2764d4513..1f7564c14e 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java @@ -242,6 +242,16 @@ public interface Generator { */ void setGenerateRecordToPojoMappers(boolean generateRecordToPojoMappers); + /** + * Whether out of the box record from POJO unmappers should be generated. + */ + boolean generateRecordFromPojoUnmappers(); + + /** + * Whether out of the box record from POJO unmappers should be generated. + */ + void setGenerateRecordFromPojoUnmappers(boolean generateRecordFromPojoUnmappers); + /** * Whether POJO's should be generated in addition to records */ diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java index 0cbb100aea..32c57973a7 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -95,6 +95,7 @@ import org.jooq.Package; import org.jooq.Parameter; import org.jooq.Record; import org.jooq.RecordMapper; +import org.jooq.RecordUnmapper; import org.jooq.Result; import org.jooq.Row; import org.jooq.Schema; @@ -1637,6 +1638,40 @@ public class JavaGenerator extends AbstractGenerator { } } + if (generateRecordFromPojoUnmappers()) { + final String pojoName = out.ref(getStrategy().getFullJavaClassName(tableUdtOrEmbeddable, Mode.POJO)); + + // Feature not supported in the Scala generator + if (scala) { + } + else { + out.println(); + out.tab(1).println("public %s<%s, %s> unmapper() {", RecordUnmapper.class, pojoName, className); + out.tab(2).println("return new %s<%s, %s>() {", RecordUnmapper.class, pojoName, className); + out.tab(3).override(); + out.tab(3).println("public %s unmap(%s pojo) {", className, pojoName); + + out.tab(4).println("%s result = new %s();", className, className); + out.println(); + + for (int i = 0; i < degree; i++) { + final TypedElementDefinition column = columns.get(i); + final String columnGetter = getStrategy().getJavaGetterName(column, Mode.POJO); + final String columnSetter = getStrategy().getJavaSetterName(column, Mode.RECORD); + + out.tab(4).println("result.%s(pojo.%s());", columnSetter, columnGetter); + } + + out.println(); + out.tab(4).println("result.attach(configuration());"); + out.tab(4).println("return result;"); + + out.tab(3).println("}"); + out.tab(2).println("};"); + out.tab(1).println("}"); + } + } + if (tableUdtOrEmbeddable instanceof TableDefinition) generateRecordClassFooter((TableDefinition) tableUdtOrEmbeddable, out); else if (tableUdtOrEmbeddable instanceof EmbeddableDefinition) diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java index 1fee595c7f..91cd67121a 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java @@ -67,6 +67,8 @@ public class Generate implements Serializable protected Boolean recordsImplementingRecordN = true; @XmlElement(defaultValue = "true") protected Boolean recordToPojoMappers = true; + @XmlElement(defaultValue = "true") + protected Boolean recordFromPojoUnmappers = true; @XmlElement(defaultValue = "false") protected Boolean pojos = false; @XmlElement(defaultValue = "false") @@ -627,6 +629,30 @@ public class Generate implements Serializable this.recordToPojoMappers = value; } + /** + * If both {@link #records} and {@link #pojos} are generated, then an auxiliary default {@link org.jooq.RecordUnmapper} can be generated as well, that bypasses reflection. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isRecordFromPojoUnmappers() { + return recordFromPojoUnmappers; + } + + /** + * Sets the value of the recordFromPojoUnmappers property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setRecordFromPojoUnmappers(Boolean value) { + this.recordFromPojoUnmappers = value; + } + /** * Generate POJOs. * @@ -1900,6 +1926,11 @@ public class Generate implements Serializable return this; } + public Generate withRecordFromPojoUnmappers(Boolean value) { + setRecordFromPojoUnmappers(value); + return this; + } + public Generate withPojos(Boolean value) { setPojos(value); return this; @@ -2238,6 +2269,11 @@ public class Generate implements Serializable sb.append(recordToPojoMappers); sb.append(""); } + if (recordFromPojoUnmappers!= null) { + sb.append(""); + sb.append(recordFromPojoUnmappers); + sb.append(""); + } if (pojos!= null) { sb.append(""); sb.append(pojos); @@ -2664,6 +2700,15 @@ public class Generate implements Serializable return false; } } + if (recordFromPojoUnmappers == null) { + if (other.recordFromPojoUnmappers!= null) { + return false; + } + } else { + if (!recordFromPojoUnmappers.equals(other.recordFromPojoUnmappers)) { + return false; + } + } if (pojos == null) { if (other.pojos!= null) { return false; @@ -3122,6 +3167,7 @@ public class Generate implements Serializable result = ((prime*result)+((records == null)? 0 :records.hashCode())); result = ((prime*result)+((recordsImplementingRecordN == null)? 0 :recordsImplementingRecordN.hashCode())); result = ((prime*result)+((recordToPojoMappers == null)? 0 :recordToPojoMappers.hashCode())); + result = ((prime*result)+((recordFromPojoUnmappers == null)? 0 :recordFromPojoUnmappers.hashCode())); result = ((prime*result)+((pojos == null)? 0 :pojos.hashCode())); result = ((prime*result)+((pojosEqualsAndHashCode == null)? 0 :pojosEqualsAndHashCode.hashCode())); result = ((prime*result)+((pojosToString == null)? 0 :pojosToString.hashCode())); diff --git a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.12.0.xsd b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.12.0.xsd index 192642f4c2..89724d06f1 100644 --- a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.12.0.xsd +++ b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.12.0.xsd @@ -1079,6 +1079,10 @@ jOOQ version used for source code.]]> + + + +