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 ea25ec0464..d4ad451079 100644
--- a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java
+++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java
@@ -38,6 +38,9 @@
package org.jooq.codegen;
import static java.lang.Boolean.TRUE;
+import static org.jooq.codegen.AbstractGenerator.Language.JAVA;
+import static org.jooq.codegen.AbstractGenerator.Language.KOTLIN;
+import static org.jooq.codegen.AbstractGenerator.Language.SCALA;
import java.io.File;
import java.sql.Connection;
@@ -87,6 +90,9 @@ abstract class AbstractGenerator implements Generator {
boolean generateRecords = true;
boolean generateRecordsImplementingRecordN = true;
boolean generatePojos = false;
+ boolean generatePojosAsJavaRecordClasses = false;
+ boolean generatePojosAsScalaCaseClasses = true;
+ boolean generatePojosAsKotlinDataClasses = true;
boolean generatePojosEqualsAndHashCode = false;
boolean generatePojosToString = true;
boolean generateImmutablePojos = false;
@@ -500,7 +506,15 @@ abstract class AbstractGenerator implements Generator {
// [#1339] When immutable POJOs are generated, POJOs must be generated
// [#1280] When DAOs are generated, POJOs must be generated, too
- return generatePojos || generateImmutablePojos || generateDaos;
+ // [#3713] Scala case classes
+ // [#10287] Java records
+ // [#10288] Kotlin data classes
+ return generatePojos
+ || generatePojosAsJavaRecordClasses && language == JAVA
+ || generatePojosAsScalaCaseClasses && language == SCALA
+ || generatePojosAsKotlinDataClasses && language == KOTLIN
+ || generateImmutablePojos
+ || generateDaos;
}
@Override
@@ -508,6 +522,36 @@ abstract class AbstractGenerator implements Generator {
this.generatePojos = generatePojos;
}
+ @Override
+ public boolean generatePojosAsJavaRecordClasses() {
+ return generatePojosAsJavaRecordClasses;
+ }
+
+ @Override
+ public void setGeneratePojosAsJavaRecordClasses(boolean pojosAsJavaRecordClasses) {
+ this.generatePojosAsJavaRecordClasses = pojosAsJavaRecordClasses;
+ }
+
+ @Override
+ public boolean generatePojosAsScalaCaseClasses() {
+ return generatePojosAsScalaCaseClasses;
+ }
+
+ @Override
+ public void setGeneratePojosAsScalaCaseClasses(boolean pojosAsScalaCaseClasses) {
+ this.generatePojosAsScalaCaseClasses = pojosAsScalaCaseClasses;
+ }
+
+ @Override
+ public boolean generatePojosAsKotlinDataClasses() {
+ return generatePojosAsKotlinDataClasses;
+ }
+
+ @Override
+ public void setGeneratePojosAsKotlinDataClasses(boolean pojosAsKotlinDataClasses) {
+ this.generatePojosAsKotlinDataClasses = pojosAsKotlinDataClasses;
+ }
+
@Override
public boolean generateImmutablePojos() {
return generateImmutablePojos;
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 35ed10cc82..fecf737d4f 100644
--- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java
+++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java
@@ -709,6 +709,12 @@ public class GenerationTool {
generator.setGenerateRecordsImplementingRecordN(g.getGenerate().isRecordsImplementingRecordN());
if (g.getGenerate().isPojos() != null)
generator.setGeneratePojos(g.getGenerate().isPojos());
+ if (g.getGenerate().isPojosAsJavaRecordClasses() != null)
+ generator.setGeneratePojosAsJavaRecordClasses(g.getGenerate().isPojosAsJavaRecordClasses());
+ if (g.getGenerate().isPojosAsScalaCaseClasses() != null)
+ generator.setGeneratePojosAsScalaCaseClasses(g.getGenerate().isPojosAsScalaCaseClasses());
+ if (g.getGenerate().isPojosAsKotlinDataClasses() != null)
+ generator.setGeneratePojosAsKotlinDataClasses(g.getGenerate().isPojosAsKotlinDataClasses());
if (g.getGenerate().isImmutablePojos() != null)
generator.setGenerateImmutablePojos(g.getGenerate().isImmutablePojos());
if (g.getGenerate().isSerializablePojos() != 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 d6576db29d..fb0ea4ae12 100644
--- a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java
+++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java
@@ -362,6 +362,42 @@ public interface Generator {
*/
void setGeneratePojos(boolean generatePojos);
+ /**
+ * Whether POJOs should be generated as Java records by the
+ * {@link JavaGenerator}.
+ */
+ boolean generatePojosAsJavaRecordClasses();
+
+ /**
+ * Whether POJOs should be generated as Java records by the
+ * {@link JavaGenerator}.
+ */
+ void setGeneratePojosAsJavaRecordClasses(boolean pojosAsJavaRecordClasses);
+
+ /**
+ * Whether POJOs should be generated as Scala case classes by the
+ * {@link ScalaGenerator}.
+ */
+ boolean generatePojosAsScalaCaseClasses();
+
+ /**
+ * Whether POJOs should be generated as Scala case classes by the
+ * {@link ScalaGenerator}.
+ */
+ void setGeneratePojosAsScalaCaseClasses(boolean pojosAsScalaCaseClasses);
+
+ /**
+ * Whether POJOs should be generated as Kotlin data classes by the
+ * {@link KotlinGenerator}.
+ */
+ boolean generatePojosAsKotlinDataClasses();
+
+ /**
+ * Whether POJOs should be generated as Kotlin data classes by the
+ * {@link KotlinGenerator}.
+ */
+ void setGeneratePojosAsKotlinDataClasses(boolean pojosAsKotlinDataClasses);
+
/**
* Whether immutable POJO's should be generated in addition to records
*/
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 0f70bbcefa..48569b0207 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
@@ -92,6 +92,12 @@ public class Generate implements Serializable, XMLAppendable
@XmlElement(defaultValue = "true")
protected Boolean pojosToString = true;
@XmlElement(defaultValue = "false")
+ protected Boolean pojosAsJavaRecordClasses = false;
+ @XmlElement(defaultValue = "true")
+ protected Boolean pojosAsScalaCaseClasses = true;
+ @XmlElement(defaultValue = "true")
+ protected Boolean pojosAsKotlinDataClasses = true;
+ @XmlElement(defaultValue = "false")
protected Boolean immutablePojos = false;
@XmlElement(defaultValue = "true")
protected Boolean serializablePojos = true;
@@ -896,6 +902,78 @@ public class Generate implements Serializable, XMLAppendable
this.pojosToString = value;
}
+ /**
+ * Generate POJOs as records, when using the JavaGenerator.
+ *
+ * @return
+ * possible object is
+ * {@link Boolean }
+ *
+ */
+ public Boolean isPojosAsJavaRecordClasses() {
+ return pojosAsJavaRecordClasses;
+ }
+
+ /**
+ * Sets the value of the pojosAsJavaRecordClasses property.
+ *
+ * @param value
+ * allowed object is
+ * {@link Boolean }
+ *
+ */
+ public void setPojosAsJavaRecordClasses(Boolean value) {
+ this.pojosAsJavaRecordClasses = value;
+ }
+
+ /**
+ * Generate POJOs as case classes, when using the ScalaGenerator.
+ *
+ * @return
+ * possible object is
+ * {@link Boolean }
+ *
+ */
+ public Boolean isPojosAsScalaCaseClasses() {
+ return pojosAsScalaCaseClasses;
+ }
+
+ /**
+ * Sets the value of the pojosAsScalaCaseClasses property.
+ *
+ * @param value
+ * allowed object is
+ * {@link Boolean }
+ *
+ */
+ public void setPojosAsScalaCaseClasses(Boolean value) {
+ this.pojosAsScalaCaseClasses = value;
+ }
+
+ /**
+ * Generate POJOs as data classes, when using the KotlinGenerator.
+ *
+ * @return
+ * possible object is
+ * {@link Boolean }
+ *
+ */
+ public Boolean isPojosAsKotlinDataClasses() {
+ return pojosAsKotlinDataClasses;
+ }
+
+ /**
+ * Sets the value of the pojosAsKotlinDataClasses property.
+ *
+ * @param value
+ * allowed object is
+ * {@link Boolean }
+ *
+ */
+ public void setPojosAsKotlinDataClasses(Boolean value) {
+ this.pojosAsKotlinDataClasses = value;
+ }
+
/**
* Generate immutable POJOs.
*
@@ -2233,6 +2311,21 @@ public class Generate implements Serializable, XMLAppendable
return this;
}
+ public Generate withPojosAsJavaRecordClasses(Boolean value) {
+ setPojosAsJavaRecordClasses(value);
+ return this;
+ }
+
+ public Generate withPojosAsScalaCaseClasses(Boolean value) {
+ setPojosAsScalaCaseClasses(value);
+ return this;
+ }
+
+ public Generate withPojosAsKotlinDataClasses(Boolean value) {
+ setPojosAsKotlinDataClasses(value);
+ return this;
+ }
+
public Generate withImmutablePojos(Boolean value) {
setImmutablePojos(value);
return this;
@@ -2530,6 +2623,9 @@ public class Generate implements Serializable, XMLAppendable
builder.append("pojos", pojos);
builder.append("pojosEqualsAndHashCode", pojosEqualsAndHashCode);
builder.append("pojosToString", pojosToString);
+ builder.append("pojosAsJavaRecordClasses", pojosAsJavaRecordClasses);
+ builder.append("pojosAsScalaCaseClasses", pojosAsScalaCaseClasses);
+ builder.append("pojosAsKotlinDataClasses", pojosAsKotlinDataClasses);
builder.append("immutablePojos", immutablePojos);
builder.append("serializablePojos", serializablePojos);
builder.append("interfaces", interfaces);
@@ -2870,6 +2966,33 @@ public class Generate implements Serializable, XMLAppendable
return false;
}
}
+ if (pojosAsJavaRecordClasses == null) {
+ if (other.pojosAsJavaRecordClasses!= null) {
+ return false;
+ }
+ } else {
+ if (!pojosAsJavaRecordClasses.equals(other.pojosAsJavaRecordClasses)) {
+ return false;
+ }
+ }
+ if (pojosAsScalaCaseClasses == null) {
+ if (other.pojosAsScalaCaseClasses!= null) {
+ return false;
+ }
+ } else {
+ if (!pojosAsScalaCaseClasses.equals(other.pojosAsScalaCaseClasses)) {
+ return false;
+ }
+ }
+ if (pojosAsKotlinDataClasses == null) {
+ if (other.pojosAsKotlinDataClasses!= null) {
+ return false;
+ }
+ } else {
+ if (!pojosAsKotlinDataClasses.equals(other.pojosAsKotlinDataClasses)) {
+ return false;
+ }
+ }
if (immutablePojos == null) {
if (other.immutablePojos!= null) {
return false;
@@ -3348,6 +3471,9 @@ public class Generate implements Serializable, XMLAppendable
result = ((prime*result)+((pojos == null)? 0 :pojos.hashCode()));
result = ((prime*result)+((pojosEqualsAndHashCode == null)? 0 :pojosEqualsAndHashCode.hashCode()));
result = ((prime*result)+((pojosToString == null)? 0 :pojosToString.hashCode()));
+ result = ((prime*result)+((pojosAsJavaRecordClasses == null)? 0 :pojosAsJavaRecordClasses.hashCode()));
+ result = ((prime*result)+((pojosAsScalaCaseClasses == null)? 0 :pojosAsScalaCaseClasses.hashCode()));
+ result = ((prime*result)+((pojosAsKotlinDataClasses == null)? 0 :pojosAsKotlinDataClasses.hashCode()));
result = ((prime*result)+((immutablePojos == null)? 0 :immutablePojos.hashCode()));
result = ((prime*result)+((serializablePojos == null)? 0 :serializablePojos.hashCode()));
result = ((prime*result)+((interfaces == null)? 0 :interfaces.hashCode()));
diff --git a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.14.0.xsd b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.14.0.xsd
index dc7f8ef12f..4cf93aac66 100644
--- a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.14.0.xsd
+++ b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.14.0.xsd
@@ -1223,6 +1223,18 @@ jOOQ version used for source code.]]>
+
+
+
+
+
+
+
+
+
+
+
+