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 40a7e2370c..0e1c390f23 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -3507,6 +3507,8 @@ public class JavaGenerator extends AbstractGenerator { final String domainTypeFull = getJavaType(domain.getType(resolver(out)), out); final String domainType = out.ref(domainTypeFull); final String domainTypeRef = getJavaTypeReference(domain.getDatabase(), domain.getType(resolver(out)), out); + final List converter = out.ref(list(domain.getType(resolver(out)).getConverter())); + final List binding = out.ref(list(domain.getType(resolver(out)).getBinding())); out.javadoc("The domain %s.", domain.getQualifiedOutputName()); @@ -3515,6 +3517,8 @@ public class JavaGenerator extends AbstractGenerator { out.println(" schema"); out.println(", %s.name(\"%s\")", DSL.class, escapeString(domain.getOutputName())); out.println(", %s", domainTypeRef); + if (!converter.isEmpty() && !binding.isEmpty()) + out.println(converterTemplate(converter) + converterTemplate(binding), converter, binding); for (String check : domain.getCheckClauses()) out.println(", %s.createCheck(null, null, \"%s\")", Internal.class, escapeString(check)); @@ -3526,6 +3530,8 @@ public class JavaGenerator extends AbstractGenerator { out.println(" schema()"); out.println(", %s.name(\"%s\")", DSL.class, escapeString(domain.getOutputName())); out.println(", %s", domainTypeRef); + if (!converter.isEmpty() && !binding.isEmpty()) + out.println(converterTemplate(converter) + converterTemplate(binding), converter, binding); for (String check : domain.getCheckClauses()) out.println(", %s.createCheck<%s>(null, null, \"%s\")", Internal.class, Record.class, escapeString(check)); @@ -3533,10 +3539,13 @@ public class JavaGenerator extends AbstractGenerator { out.println(")"); } else { + // out.println("%sstatic final %s<%s> %s = %s.createDomain(", visibility(), Domain.class, domainType, id, Internal.class); out.println(" schema()"); out.println(", %s.name(\"%s\")", DSL.class, escapeString(domain.getOutputName())); out.println(", %s", domainTypeRef); + if (!converter.isEmpty() && !binding.isEmpty()) + out.println(converterTemplate(converter) + converterTemplate(binding), converter, binding); for (String check : domain.getCheckClauses()) out.println(", %s.createCheck(null, null, \"%s\")", Internal.class, escapeString(check)); @@ -6125,14 +6134,21 @@ public class JavaGenerator extends AbstractGenerator { } for (ColumnDefinition column : table.getColumns()) { - final String columnTypeFull = getJavaType(column.getType(resolver(out)), out); + final DataTypeDefinition columnTypeDef = column.getType(resolver(out)); + final DomainDefinition domain = schema.getDatabase().getDomain(schema, columnTypeDef.getQualifiedUserType()); + final String columnTypeFull = getJavaType(columnTypeDef, out); final String columnType = out.ref(columnTypeFull); - final String columnTypeRef = getJavaTypeReference(column.getDatabase(), column.getType(resolver(out)), out); + final String columnTypeRef = getJavaTypeReference(column.getDatabase(), columnTypeDef, out); final String columnId = out.ref(getStrategy().getJavaIdentifier(column), colRefSegments(column)); final String columnName = column.getName(); - final List converter = out.ref(list(column.getType(resolver(out)).getConverter())); - final List binding = out.ref(list(column.getType(resolver(out)).getBinding())); + final List converter = new ArrayList<>(); + final List binding = new ArrayList<>(); final List generator = new ArrayList<>(); + // [#14916] Domain types may already have bindings/converters. Don't re-apply them. + if (domain == null || !StringUtils.equals(domain.getType(resolver(out)).getConverter(), columnTypeDef.getConverter())) + binding.addAll(out.ref(list(columnTypeDef.getConverter()))); + if (domain == null || !StringUtils.equals(domain.getType(resolver(out)).getBinding(), columnTypeDef.getBinding())) + binding.addAll(out.ref(list(columnTypeDef.getBinding()))); @@ -9639,7 +9655,7 @@ public class JavaGenerator extends AbstractGenerator { // Check for DOMAIN types else if (db.getDomain(schema, u) != null) { - type = getJavaType(db.getDomain(schema, u).getDefinedType(), out); + type = getJavaType(db.getDomain(schema, u).getType(resolver(out)), out); } // Check for ENUM types diff --git a/jOOQ/src/main/java/org/jooq/impl/Internal.java b/jOOQ/src/main/java/org/jooq/impl/Internal.java index b83a804180..815a8b19e8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Internal.java +++ b/jOOQ/src/main/java/org/jooq/impl/Internal.java @@ -254,7 +254,37 @@ public final class Internal { */ @NotNull public static final Domain createDomain(Schema schema, Name name, DataType type, Check... checks) { - return new DomainImpl<>(schema, name, type, checks); + return createDomain(schema, name, type, null, null, checks); + } + + /** + * Factory method for domain specifications. + */ + @NotNull + public static final Domain createDomain(Schema schema, Name name, DataType type, Converter converter, Check... checks) { + return createDomain(schema, name, type, converter, null, checks); + } + + /** + * Factory method for domain specifications. + */ + @NotNull + public static final Domain createDomain(Schema schema, Name name, DataType type, Binding binding, Check... checks) { + return createDomain(schema, name, type, null, binding, checks); + } + + /** + * Factory method for domain specifications. + */ + @NotNull + public static final Domain createDomain(Schema schema, Name name, DataType type, Converter converter, Binding binding, Check... checks) { + Binding actualBinding = DefaultBinding.newBinding(converter, type, binding); + DataType actualType = + converter == null && binding == null + ? (DataType) type + : type.asConvertedDataType(actualBinding); + + return new DomainImpl<>(schema, name, actualType, checks); } /**