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 11d36ff1f8..418cf0a104 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java @@ -65,140 +65,142 @@ import org.jooq.tools.JooqLogger; */ abstract class AbstractGenerator implements Generator { - private static final JooqLogger log = JooqLogger.getLogger(AbstractGenerator.class); + private static final JooqLogger log = JooqLogger.getLogger(AbstractGenerator.class); - boolean generateDeprecated = true; - boolean generateDeprecationOnUnknownTypes = true; - boolean generateIndexes = true; - boolean generateRelations = true; - boolean generateUDTPaths = true; - boolean generateImplicitJoinPathsToOne = true; - boolean generateImplicitJoinPathsToMany = true; - boolean generateImplicitJoinPathTableSubtypes = true; - boolean generateImplicitJoinPathUnusedConstructors = true; - boolean generateImplicitJoinPathsAsKotlinProperties = true; - boolean generateInstanceFields = true; - VisibilityModifier generateVisibilityModifier = VisibilityModifier.DEFAULT; - boolean generateGeneratedAnnotation = false; - GeneratedAnnotationType generatedGeneratedAnnotationType = GeneratedAnnotationType.DETECT_FROM_JDK; - boolean generateGeneratedAnnotationDate = false; - boolean generateGeneratedAnnotationJooqVersion = true; - boolean generateNonnullAnnotation = false; - String generatedNonnullAnnotationType = "javax.annotation.Nonnull"; - boolean generateNullableAnnotation = false; - boolean generateNullableAnnotationOnWriteOnlyNullableTypes = false; - String generatedNullableAnnotationType = "javax.annotation.Nullable"; - boolean generateConstructorPropertiesAnnotation = false; + boolean generateDeprecated = true; + boolean generateDeprecationOnUnknownTypes = true; + boolean generateIndexes = true; + boolean generateRelations = true; + boolean generateUDTPaths = true; + boolean generateImplicitJoinPathsToOne = true; + boolean generateImplicitJoinPathsToMany = true; + boolean generateImplicitJoinPathTableSubtypes = true; + boolean generateImplicitJoinPathUnusedConstructors = true; + boolean generateImplicitJoinPathsAsKotlinProperties = true; + boolean generateInstanceFields = true; + VisibilityModifier generateVisibilityModifier = VisibilityModifier.DEFAULT; + boolean generateGeneratedAnnotation = false; + GeneratedAnnotationType generatedGeneratedAnnotationType = GeneratedAnnotationType.DETECT_FROM_JDK; + boolean generateGeneratedAnnotationDate = false; + boolean generateGeneratedAnnotationJooqVersion = true; + boolean generateNonnullAnnotation = false; + String generatedNonnullAnnotationType = "javax.annotation.Nonnull"; + boolean generateNullableAnnotation = false; + boolean generateNullableAnnotationOnWriteOnlyNullableTypes = false; + String generatedNullableAnnotationType = "javax.annotation.Nullable"; + boolean generateConstructorPropertiesAnnotation = false; Boolean generateConstructorPropertiesAnnotationOnPojos; Boolean generateConstructorPropertiesAnnotationOnRecords; - boolean useSchemaVersionProvider = false; - boolean useCatalogVersionProvider = false; - boolean generateRoutines = true; + boolean useSchemaVersionProvider = false; + boolean useCatalogVersionProvider = false; + boolean generateRoutines = true; - boolean generateSequences = true; - boolean generateSequenceFlags = true; - boolean generateUDTs = true; - boolean generateTables = true; - boolean generateEmbeddables = true; - boolean generateRecords = true; - boolean generateRecordsImplementingRecordN = false; - boolean generateEnumsAsScalaSealedTraits = false; - boolean generateEnumsAsScalaEnums = true; - boolean generatePojos = false; - boolean generatePojosAsJavaRecordClasses = false; - boolean generatePojosAsScalaCaseClasses = true; - boolean generatePojosAsKotlinDataClasses = true; - boolean generatePojosEqualsAndHashCode = true; - boolean generatePojosToString = true; - boolean generateImmutablePojos = false; - boolean generateSerializablePojos = true; - boolean generateInterfaces = false; - boolean generateImmutableInterfaces = false; - boolean generateSerializableInterfaces = true; - boolean generateDaos = false; - boolean generateJooqVersionReference = true; - boolean generateJPAAnnotations = false; - String generateJPAVersion = ""; - boolean generateValidationAnnotations = false; - boolean generateSpringAnnotations = false; - boolean generateSpringDao = false; - boolean generateKotlinSetterJvmNameAnnotationsOnIsPrefix = true; - boolean generateKotlinNotNullPojoAttributes = false; - boolean generateKotlinNotNullRecordAttributes = false; - boolean generateKotlinNotNullInterfaceAttributes = false; - boolean generateKotlinDefaultedNullablePojoAttributes = true; - boolean generateKotlinDefaultedNullableRecordAttributes = true; - GeneratedSerialVersionUID generatedSerialVersionUID = GeneratedSerialVersionUID.CONSTANT; - int maxMembersPerInitialiser = 500; - boolean generateQueues = true; - boolean generateLinks = true; - boolean generateKeys = true; - boolean generateGlobalObjectNames = true; - boolean generateGlobalObjectReferences = true; - boolean generateGlobalCatalogReferences = true; - boolean generateGlobalSchemaReferences = true; - boolean generateGlobalRoutineReferences = true; - boolean generateGlobalSequenceReferences = true; - boolean generateGlobalTableReferences = true; - boolean generateGlobalDomainReferences = true; + boolean generateSequences = true; + boolean generateSequenceFlags = true; + boolean generateUDTs = true; + boolean generateTables = true; + boolean generateEmbeddables = true; + boolean generateRecords = true; + boolean generateRecordsImplementingRecordN = false; + boolean generateEnumsAsScalaSealedTraits = false; + boolean generateEnumsAsScalaEnums = true; + boolean generatePojos = false; + boolean generatePojosAsJavaRecordClasses = false; + boolean generatePojosAsScalaCaseClasses = true; + boolean generatePojosAsKotlinDataClasses = true; + boolean generatePojosEqualsAndHashCode = true; + String generatePojosEqualsAndHashCodeColumnIncludeExpression = null; + String generatePojosEqualsAndHashCodeColumnExcludeExpression = null; + boolean generatePojosToString = true; + boolean generateImmutablePojos = false; + boolean generateSerializablePojos = true; + boolean generateInterfaces = false; + boolean generateImmutableInterfaces = false; + boolean generateSerializableInterfaces = true; + boolean generateDaos = false; + boolean generateJooqVersionReference = true; + boolean generateJPAAnnotations = false; + String generateJPAVersion = ""; + boolean generateValidationAnnotations = false; + boolean generateSpringAnnotations = false; + boolean generateSpringDao = false; + boolean generateKotlinSetterJvmNameAnnotationsOnIsPrefix = true; + boolean generateKotlinNotNullPojoAttributes = false; + boolean generateKotlinNotNullRecordAttributes = false; + boolean generateKotlinNotNullInterfaceAttributes = false; + boolean generateKotlinDefaultedNullablePojoAttributes = true; + boolean generateKotlinDefaultedNullableRecordAttributes = true; + GeneratedSerialVersionUID generatedSerialVersionUID = GeneratedSerialVersionUID.CONSTANT; + int maxMembersPerInitialiser = 500; + boolean generateQueues = true; + boolean generateLinks = true; + boolean generateKeys = true; + boolean generateGlobalObjectNames = true; + boolean generateGlobalObjectReferences = true; + boolean generateGlobalCatalogReferences = true; + boolean generateGlobalSchemaReferences = true; + boolean generateGlobalRoutineReferences = true; + boolean generateGlobalSequenceReferences = true; + boolean generateGlobalTableReferences = true; + boolean generateGlobalDomainReferences = true; - boolean generateGlobalUDTReferences = true; - boolean generateGlobalQueueReferences = true; - boolean generateGlobalLinkReferences = true; - boolean generateGlobalKeyReferences = true; - boolean generateGlobalIndexReferences = true; - boolean generateDefaultCatalog = true; - boolean generateDefaultSchema = true; - boolean generateJavadoc = true; - boolean generateComments = true; - boolean generateCommentsOnAttributes = true; - boolean generateCommentsOnCatalogs = true; - boolean generateCommentsOnColumns = true; - boolean generateCommentsOnKeys = true; - boolean generateCommentsOnLinks = true; - boolean generateCommentsOnPackages = true; - boolean generateCommentsOnParameters = true; - boolean generateCommentsOnQueues = true; - boolean generateCommentsOnRoutines = true; - boolean generateCommentsOnSchemas = true; - boolean generateCommentsOnSequences = true; - boolean generateCommentsOnDomains = true; - boolean generateCommentsOnTables = true; - boolean generateCommentsOnUDTs = true; - boolean generateCommentsOnEmbeddables = true; - boolean generateSources = true; - boolean generateSourcesOnViews = true; - boolean generateFluentSetters = false; - boolean generateJavaBeansGettersAndSetters = false; - boolean generateUseTableNameForUnambiguousFKs = true; - boolean generateVarargsSetters = true; - String generateFullyQualifiedTypes = ""; - boolean generateJavaTimeTypes = true; - boolean generateSpatialTypes = true; - boolean generateXmlTypes = true; - boolean generateJsonTypes = true; - boolean generateIntervalTypes = true; - boolean generateDecfloatTypes = true; - boolean generateTableValuedFunctions = false; - boolean generateEmptyCatalogs = false; - boolean generateEmptySchemas = false; - String generateNewline = "\n"; + boolean generateGlobalUDTReferences = true; + boolean generateGlobalQueueReferences = true; + boolean generateGlobalLinkReferences = true; + boolean generateGlobalKeyReferences = true; + boolean generateGlobalIndexReferences = true; + boolean generateDefaultCatalog = true; + boolean generateDefaultSchema = true; + boolean generateJavadoc = true; + boolean generateComments = true; + boolean generateCommentsOnAttributes = true; + boolean generateCommentsOnCatalogs = true; + boolean generateCommentsOnColumns = true; + boolean generateCommentsOnKeys = true; + boolean generateCommentsOnLinks = true; + boolean generateCommentsOnPackages = true; + boolean generateCommentsOnParameters = true; + boolean generateCommentsOnQueues = true; + boolean generateCommentsOnRoutines = true; + boolean generateCommentsOnSchemas = true; + boolean generateCommentsOnSequences = true; + boolean generateCommentsOnDomains = true; + boolean generateCommentsOnTables = true; + boolean generateCommentsOnUDTs = true; + boolean generateCommentsOnEmbeddables = true; + boolean generateSources = true; + boolean generateSourcesOnViews = true; + boolean generateFluentSetters = false; + boolean generateJavaBeansGettersAndSetters = false; + boolean generateUseTableNameForUnambiguousFKs = true; + boolean generateVarargsSetters = true; + String generateFullyQualifiedTypes = ""; + boolean generateJavaTimeTypes = true; + boolean generateSpatialTypes = true; + boolean generateXmlTypes = true; + boolean generateJsonTypes = true; + boolean generateIntervalTypes = true; + boolean generateDecfloatTypes = true; + boolean generateTableValuedFunctions = false; + boolean generateEmptyCatalogs = false; + boolean generateEmptySchemas = false; + String generateNewline = "\n"; String generateIndentation; - int generatePrintMarginForBlockComment = 80; - GeneratedTextBlocks generateTextBlocks = GeneratedTextBlocks.DETECT_FROM_JDK; - boolean generateWhereMethodOverrides = true; - boolean generateRenameMethodOverrides = true; - boolean generateAsMethodOverrides = true; + int generatePrintMarginForBlockComment = 80; + GeneratedTextBlocks generateTextBlocks = GeneratedTextBlocks.DETECT_FROM_JDK; + boolean generateWhereMethodOverrides = true; + boolean generateRenameMethodOverrides = true; + boolean generateAsMethodOverrides = true; protected GeneratorStrategyWrapper strategy; - protected String targetEncoding = "UTF-8"; - protected boolean targetClean = true; + protected String targetEncoding = "UTF-8"; + protected boolean targetClean = true; final Language languageConfigured; Language language; Database database; @@ -1399,6 +1401,26 @@ abstract class AbstractGenerator implements Generator { this.generatePojosEqualsAndHashCode = generatePojosEqualsAndHashCode; } + @Override + public String generatePojosEqualsAndHashCodeColumnIncludeExpression() { + return generatePojosEqualsAndHashCodeColumnIncludeExpression; + } + + @Override + public void setGeneratePojosEqualsAndHashCodeColumnIncludeExpression(String generatePojosEqualsAndHashCodeColumnIncludeExpression) { + this.generatePojosEqualsAndHashCodeColumnIncludeExpression = generatePojosEqualsAndHashCodeColumnIncludeExpression; + } + + @Override + public String generatePojosEqualsAndHashCodeColumnExcludeExpression() { + return generatePojosEqualsAndHashCodeColumnExcludeExpression; + } + + @Override + public void setGeneratePojosEqualsAndHashCodeColumnExcludeExpression(String generatePojosEqualsAndHashCodeColumnExcludeExpression) { + this.generatePojosEqualsAndHashCodeColumnExcludeExpression = generatePojosEqualsAndHashCodeColumnExcludeExpression; + } + @Override public boolean generatePojosToString() { return generatePojosToString; 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 4c56cbf37f..d1b235ad1f 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java @@ -954,6 +954,10 @@ public class GenerationTool { generator.setGenerateVarargsSetters(g.getGenerate().isVarargSetters()); if (g.getGenerate().isPojosEqualsAndHashCode() != null) generator.setGeneratePojosEqualsAndHashCode(g.getGenerate().isPojosEqualsAndHashCode()); + if (g.getGenerate().getPojosEqualsAndHashCodeColumnIncludeExpression() != null) + generator.setGeneratePojosEqualsAndHashCodeColumnIncludeExpression(g.getGenerate().getPojosEqualsAndHashCodeColumnIncludeExpression()); + if (g.getGenerate().getPojosEqualsAndHashCodeColumnExcludeExpression() != null) + generator.setGeneratePojosEqualsAndHashCodeColumnExcludeExpression(g.getGenerate().getPojosEqualsAndHashCodeColumnExcludeExpression()); if (g.getGenerate().isPojosToString() != null) generator.setGeneratePojosToString(g.getGenerate().isPojosToString()); if (g.getGenerate().getFullyQualifiedTypes() != 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 7c58cb5d3b..f22277d0a8 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java @@ -1290,6 +1290,30 @@ public interface Generator { */ void setGeneratePojosEqualsAndHashCode(boolean generatePojosEqualsAndHashCode); + /** + * A regular expression matching columns to include in equals() + * and hashCode() methods of generated POJOS. + */ + String generatePojosEqualsAndHashCodeColumnIncludeExpression(); + + /** + * A regular expression matching columns to include in equals() + * and hashCode() methods of generated POJOS. + */ + void setGeneratePojosEqualsAndHashCodeColumnIncludeExpression(String generatePojosEqualsAndHashCodeColumnIncludeExpression); + + /** + * A regular expression matching columns to exclude in equals() + * and hashCode() methods of generated POJOS. + */ + String generatePojosEqualsAndHashCodeColumnExcludeExpression(); + + /** + * A regular expression matching columns to exclude in equals() + * and hashCode() methods of generated POJOS. + */ + void setGeneratePojosEqualsAndHashCodeColumnExcludeExpression(String generatePojosEqualsAndHashCodeColumnExcludeExpression); + /** * Whether a toString() method should be generated on POJOs */ 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 ce753667f0..db2edbd831 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -6836,6 +6836,14 @@ public class JavaGenerator extends AbstractGenerator { final String className = getStrategy().getJavaClassName(tableUdtOrEmbeddable, Mode.POJO); List replacingEmbeddablesAndUnreplacedColumns = replacingEmbeddablesAndUnreplacedColumns(tableUdtOrEmbeddable); + if (generatePojosEqualsAndHashCodeColumnIncludeExpression() != null || + generatePojosEqualsAndHashCodeColumnExcludeExpression() != null) + replacingEmbeddablesAndUnreplacedColumns = database.filterExcludeInclude( + replacingEmbeddablesAndUnreplacedColumns, + generatePojosEqualsAndHashCodeColumnExcludeExpression(), + generatePojosEqualsAndHashCodeColumnIncludeExpression() + ); + out.println(); if (scala) { diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/Database.java b/jOOQ-meta/src/main/java/org/jooq/meta/Database.java index 582b8e8e8f..4655ac39a6 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/Database.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/Database.java @@ -969,6 +969,11 @@ public interface Database extends AutoCloseable { */ List filterExcludeInclude(List definitions); + /** + * Filter a list of definitions according to the exclude / include expressions passed as arguments. + */ + List filterExcludeInclude(List definitions, String exclude, String include); + /** * Sort a list of definitions according to the {@link #getOrderProvider()} defined in this database. */ 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 0baacd6814..6900912a93 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 @@ -116,6 +116,12 @@ public class Generate implements Serializable, XMLAppendable protected Boolean pojos = false; @XmlElement(defaultValue = "true") protected Boolean pojosEqualsAndHashCode = true; + @XmlElement(defaultValue = "") + @XmlJavaTypeAdapter(StringAdapter.class) + protected String pojosEqualsAndHashCodeColumnIncludeExpression = ""; + @XmlElement(defaultValue = "") + @XmlJavaTypeAdapter(StringAdapter.class) + protected String pojosEqualsAndHashCodeColumnExcludeExpression = ""; @XmlElement(defaultValue = "true") protected Boolean pojosToString = true; @XmlElement(defaultValue = "false") @@ -1291,6 +1297,38 @@ public class Generate implements Serializable, XMLAppendable this.pojosEqualsAndHashCode = value; } + /** + * The regular expression matching columns for inclusion in generated equals() and hashCode() methods in POJOs. + * + */ + public String getPojosEqualsAndHashCodeColumnIncludeExpression() { + return pojosEqualsAndHashCodeColumnIncludeExpression; + } + + /** + * The regular expression matching columns for inclusion in generated equals() and hashCode() methods in POJOs. + * + */ + public void setPojosEqualsAndHashCodeColumnIncludeExpression(String value) { + this.pojosEqualsAndHashCodeColumnIncludeExpression = value; + } + + /** + * The regular expression matching columns for exclusion in generated equals() and hashCode() methods in POJOs. + * + */ + public String getPojosEqualsAndHashCodeColumnExcludeExpression() { + return pojosEqualsAndHashCodeColumnExcludeExpression; + } + + /** + * The regular expression matching columns for exclusion in generated equals() and hashCode() methods in POJOs. + * + */ + public void setPojosEqualsAndHashCodeColumnExcludeExpression(String value) { + this.pojosEqualsAndHashCodeColumnExcludeExpression = value; + } + /** * Generate basic toString() methods in POJOs. * @@ -3650,6 +3688,24 @@ public class Generate implements Serializable, XMLAppendable return this; } + /** + * The regular expression matching columns for inclusion in generated equals() and hashCode() methods in POJOs. + * + */ + public Generate withPojosEqualsAndHashCodeColumnIncludeExpression(String value) { + setPojosEqualsAndHashCodeColumnIncludeExpression(value); + return this; + } + + /** + * The regular expression matching columns for exclusion in generated equals() and hashCode() methods in POJOs. + * + */ + public Generate withPojosEqualsAndHashCodeColumnExcludeExpression(String value) { + setPojosEqualsAndHashCodeColumnExcludeExpression(value); + return this; + } + /** * Generate basic toString() methods in POJOs. * @@ -4464,6 +4520,8 @@ public class Generate implements Serializable, XMLAppendable builder.append("enumsAsScalaEnums", enumsAsScalaEnums); builder.append("pojos", pojos); builder.append("pojosEqualsAndHashCode", pojosEqualsAndHashCode); + builder.append("pojosEqualsAndHashCodeColumnIncludeExpression", pojosEqualsAndHashCodeColumnIncludeExpression); + builder.append("pojosEqualsAndHashCodeColumnExcludeExpression", pojosEqualsAndHashCodeColumnExcludeExpression); builder.append("pojosToString", pojosToString); builder.append("pojosAsJavaRecordClasses", pojosAsJavaRecordClasses); builder.append("pojosAsScalaCaseClasses", pojosAsScalaCaseClasses); @@ -4945,6 +5003,24 @@ public class Generate implements Serializable, XMLAppendable return false; } } + if (pojosEqualsAndHashCodeColumnIncludeExpression == null) { + if (other.pojosEqualsAndHashCodeColumnIncludeExpression!= null) { + return false; + } + } else { + if (!pojosEqualsAndHashCodeColumnIncludeExpression.equals(other.pojosEqualsAndHashCodeColumnIncludeExpression)) { + return false; + } + } + if (pojosEqualsAndHashCodeColumnExcludeExpression == null) { + if (other.pojosEqualsAndHashCodeColumnExcludeExpression!= null) { + return false; + } + } else { + if (!pojosEqualsAndHashCodeColumnExcludeExpression.equals(other.pojosEqualsAndHashCodeColumnExcludeExpression)) { + return false; + } + } if (pojosToString == null) { if (other.pojosToString!= null) { return false; @@ -5732,6 +5808,8 @@ public class Generate implements Serializable, XMLAppendable result = ((prime*result)+((enumsAsScalaEnums == null)? 0 :enumsAsScalaEnums.hashCode())); result = ((prime*result)+((pojos == null)? 0 :pojos.hashCode())); result = ((prime*result)+((pojosEqualsAndHashCode == null)? 0 :pojosEqualsAndHashCode.hashCode())); + result = ((prime*result)+((pojosEqualsAndHashCodeColumnIncludeExpression == null)? 0 :pojosEqualsAndHashCodeColumnIncludeExpression.hashCode())); + result = ((prime*result)+((pojosEqualsAndHashCodeColumnExcludeExpression == null)? 0 :pojosEqualsAndHashCodeColumnExcludeExpression.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())); diff --git a/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd b/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd index 6fb9021aa9..71830b850e 100644 --- a/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd +++ b/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd @@ -2723,6 +2723,14 @@ jOOQ API, without adding custom data type bindings to them.]]> + + + + + + + +