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 ad8b13fbde..3224f512ae 100644
--- a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java
+++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java
@@ -75,6 +75,7 @@ abstract class AbstractGenerator implements Generator {
boolean generateEmbeddables = true;
boolean generateRecords = true;
boolean generateRecordsImplementingRecordN = true;
+ boolean generateRecordToPojoMappers = true;
boolean generatePojos = false;
boolean generatePojosEqualsAndHashCode = false;
boolean generatePojosToString = true;
@@ -389,6 +390,16 @@ abstract class AbstractGenerator implements Generator {
this.generateRecordsImplementingRecordN = generateRecordsImplementingRecordN;
}
+ @Override
+ public boolean generateRecordToPojoMappers() {
+ return generateRecords() && generatePojos() && generateRecordToPojoMappers;
+ }
+
+ @Override
+ public void setGenerateRecordToPojoMappers(boolean generateRecordToPojoMappers) {
+ this.generateRecordToPojoMappers = generateRecordToPojoMappers;
+ }
+
@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 bda73ae416..d2d8a5c0c0 100644
--- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java
+++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java
@@ -668,6 +668,8 @@ public class GenerationTool {
generator.setGenerateRecords(g.getGenerate().isRecords());
if (g.getGenerate().isRecordsImplementingRecordN() != null)
generator.setGenerateRecordsImplementingRecordN(g.getGenerate().isRecordsImplementingRecordN());
+ if (g.getGenerate().isRecordToPojoMappers() != null)
+ generator.setGenerateRecordToPojoMappers(g.getGenerate().isRecordToPojoMappers());
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 1fff111744..a2764d4513 100644
--- a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java
+++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java
@@ -232,6 +232,16 @@ public interface Generator {
*/
void setGenerateRecordsImplementingRecordN(boolean generateRecordsImplementingRecordN);
+ /**
+ * Whether out of the box record to POJO mappers should be generated.
+ */
+ boolean generateRecordToPojoMappers();
+
+ /**
+ * Whether out of the box record to POJO mappers should be generated.
+ */
+ void setGenerateRecordToPojoMappers(boolean generateRecordToPojoMappers);
+
/**
* 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 147014fa11..0cbb100aea 100644
--- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java
+++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java
@@ -94,6 +94,7 @@ import org.jooq.OrderField;
import org.jooq.Package;
import org.jooq.Parameter;
import org.jooq.Record;
+import org.jooq.RecordMapper;
import org.jooq.Result;
import org.jooq.Row;
import org.jooq.Schema;
@@ -1589,6 +1590,53 @@ public class JavaGenerator extends AbstractGenerator {
out.tab(1).println("}");
}
+ if (generateRecordToPojoMappers()) {
+ 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> mapper() {", RecordMapper.class, className, pojoName);
+ out.tab(2).println("return new %s<%s, %s>() {", RecordMapper.class, className, pojoName);
+ out.tab(3).override();
+ out.tab(3).println("public %s map(%s record) {", pojoName, className);
+
+ if (generateImmutablePojos()) {
+ out.tab(4).println("return new %s(", pojoName);
+
+ for (int i = 0; i < degree; i++) {
+ final TypedElementDefinition> column = columns.get(i);
+ final String columnGetter = getStrategy().getJavaGetterName(column, Mode.RECORD);
+
+ out.tab(5).println("%s()[[%s]]", columnGetter, list(i == degree - 1 ? null : ","));
+ }
+
+ out.tab(4).println(");");
+ }
+ else {
+ out.tab(4).println("%s result = new %s();", pojoName, pojoName);
+ out.println();
+
+ for (int i = 0; i < degree; i++) {
+ final TypedElementDefinition> column = columns.get(i);
+ final String columnGetter = getStrategy().getJavaGetterName(column, Mode.RECORD);
+ final String columnSetter = getStrategy().getJavaSetterName(column, Mode.POJO);
+
+ out.tab(4).println("result.%s(%s());", columnSetter, columnGetter);
+ }
+
+ out.println();
+ 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 bf6d795392..1fee595c7f 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
@@ -65,6 +65,8 @@ public class Generate implements Serializable
protected Boolean records = true;
@XmlElement(defaultValue = "true")
protected Boolean recordsImplementingRecordN = true;
+ @XmlElement(defaultValue = "true")
+ protected Boolean recordToPojoMappers = true;
@XmlElement(defaultValue = "false")
protected Boolean pojos = false;
@XmlElement(defaultValue = "false")
@@ -601,6 +603,30 @@ public class Generate implements Serializable
this.recordsImplementingRecordN = value;
}
+ /**
+ * If both {@link #records} and {@link #pojos} are generated, then an auxiliary default {@link org.jooq.RecordMapper} can be generated as well, that bypasses reflection.
+ *
+ * @return
+ * possible object is
+ * {@link Boolean }
+ *
+ */
+ public Boolean isRecordToPojoMappers() {
+ return recordToPojoMappers;
+ }
+
+ /**
+ * Sets the value of the recordToPojoMappers property.
+ *
+ * @param value
+ * allowed object is
+ * {@link Boolean }
+ *
+ */
+ public void setRecordToPojoMappers(Boolean value) {
+ this.recordToPojoMappers = value;
+ }
+
/**
* Generate POJOs.
*
@@ -1869,6 +1895,11 @@ public class Generate implements Serializable
return this;
}
+ public Generate withRecordToPojoMappers(Boolean value) {
+ setRecordToPojoMappers(value);
+ return this;
+ }
+
public Generate withPojos(Boolean value) {
setPojos(value);
return this;
@@ -2202,6 +2233,11 @@ public class Generate implements Serializable
sb.append(recordsImplementingRecordN);
sb.append("");
}
+ if (recordToPojoMappers!= null) {
+ sb.append("");
+ sb.append(recordToPojoMappers);
+ sb.append("");
+ }
if (pojos!= null) {
sb.append("");
sb.append(pojos);
@@ -2619,6 +2655,15 @@ public class Generate implements Serializable
return false;
}
}
+ if (recordToPojoMappers == null) {
+ if (other.recordToPojoMappers!= null) {
+ return false;
+ }
+ } else {
+ if (!recordToPojoMappers.equals(other.recordToPojoMappers)) {
+ return false;
+ }
+ }
if (pojos == null) {
if (other.pojos!= null) {
return false;
@@ -3076,6 +3121,7 @@ public class Generate implements Serializable
result = ((prime*result)+((embeddables == null)? 0 :embeddables.hashCode()));
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)+((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 2ee4024ad7..192642f4c2 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
@@ -1075,6 +1075,10 @@ jOOQ version used for source code.]]>
+
+
+
+