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.]]>
+
+
+
+