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 722683f1dd..fea3b89ed5 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -151,6 +151,7 @@ import org.jooq.meta.IndexDefinition; import org.jooq.meta.JavaTypeResolver; import org.jooq.meta.PackageDefinition; import org.jooq.meta.ParameterDefinition; +import org.jooq.meta.PositionedDefinition; import org.jooq.meta.RoutineDefinition; import org.jooq.meta.SchemaDefinition; import org.jooq.meta.SequenceDefinition; @@ -1314,10 +1315,6 @@ public class JavaGenerator extends AbstractGenerator { else baseClass = TableRecordImpl.class; - Map, Integer> columnIndexes = new LinkedHashMap<>(); - for (int i = 0; i < columns.size(); i++) - columnIndexes.put(columns.get(i), i); - List columnsOrReplacingEmbeddables = columnsOrReplacingEmbeddables(tableUdtOrEmbeddable); int degree = columns.size(); @@ -1763,10 +1760,10 @@ public class JavaGenerator extends AbstractGenerator { - generateRecordConstructor(tableUdtOrEmbeddable, out, columnIndexes, columns); + generateRecordConstructor(tableUdtOrEmbeddable, out, columns); if (!columns.equals(columnsOrReplacingEmbeddables)) - generateRecordConstructor(tableUdtOrEmbeddable, out, columnIndexes, columnsOrReplacingEmbeddables); + generateRecordConstructor(tableUdtOrEmbeddable, out, columnsOrReplacingEmbeddables); if (tableUdtOrEmbeddable instanceof TableDefinition) generateRecordClassFooter((TableDefinition) tableUdtOrEmbeddable, out); @@ -1803,7 +1800,6 @@ public class JavaGenerator extends AbstractGenerator { private void generateRecordConstructor( Definition tableUdtOrEmbeddable, JavaWriter out, - Map, Integer> columnIndexes, Collection columns ) { final String className = getStrategy().getJavaClassName(tableUdtOrEmbeddable, Mode.RECORD); @@ -1863,7 +1859,7 @@ public class JavaGenerator extends AbstractGenerator { out.println(); } - for (Definition column : columns) + for (Definition column : columns) { if (column instanceof EmbeddableDefinition) // TODO: Setters of X properties cannot accept X? in Kotlin: https://twitter.com/lukaseder/status/1296371561214234624 @@ -1875,12 +1871,9 @@ public class JavaGenerator extends AbstractGenerator { Collections.nCopies(((EmbeddableDefinition) column).getColumns().size(), "null")); else out.println("%s(%s)%s", getStrategy().getJavaSetterName(column, Mode.RECORD), getStrategy().getJavaMemberName(column, Mode.DEFAULT), semicolon); - else if (kotlin) - out.println("this.%s = %s", - getStrategy().getJavaMemberName(column, Mode.POJO), - getStrategy().getJavaMemberName(column, Mode.POJO)); else - out.println("set(%s, %s)%s", columnIndexes.get(column), getStrategy().getJavaMemberName(column, Mode.DEFAULT), semicolon); + out.println("set(%s, %s)%s", ((PositionedDefinition) column).getPosition() - 1, getStrategy().getJavaMemberName(column, Mode.POJO), semicolon); + } out.println("}"); } @@ -2047,25 +2040,25 @@ public class JavaGenerator extends AbstractGenerator { out.tab(1).println("set(value) {"); } else { - final String nonnullAnnotation = nonnullAnnotation(out); - out.overrideIf(override); - out.println("public %s %s([[before=@][after= ][%s]]%s value) {", setterReturnType, setter, list(nonnullAnnotation), type); + out.println("public %s %s([[before=@][after= ][%s]]%s value) {", setterReturnType, setter, list(nonnullAnnotation(out)), type); } for (EmbeddableColumnDefinition column : embeddable.getColumns()) { - if (kotlin) { - final String s = getStrategy().getJavaMemberName(column.getReferencingColumn(), Mode.POJO); - final String g = getStrategy().getJavaMemberName(column, Mode.POJO); + final int position = column.getReferencingColumnPosition() - 1; - out.tab(1).println("%s = value.%s", s, g); - } - else { - final String s = getStrategy().getJavaSetterName(column.getReferencingColumn(), Mode.RECORD); - final String g = getStrategy().getJavaGetterName(column, Mode.RECORD); - - out.println("%s(value.%s%s)%s", s, g, emptyparens, semicolon); - } + if (kotlin) + out.tab(1).println("set(%s, value.%s)", + position, + getStrategy().getJavaMemberName(column, Mode.POJO) + ); + else + out.println("set(%s, value.%s%s)%s", + position, + getStrategy().getJavaGetterName(column, Mode.RECORD), + emptyparens, + semicolon + ); } if (generateFluentSetters()) @@ -2171,10 +2164,21 @@ public class JavaGenerator extends AbstractGenerator { String separator = " "; for (EmbeddableColumnDefinition column : embeddable.getColumns()) { - if (kotlin) - out.tab(1).println("%s%s", separator, getStrategy().getJavaMemberName(column.getReferencingColumn(), Mode.POJO)); - else - out.println("%s%s%s", separator, getStrategy().getJavaGetterName(column.getReferencingColumn(), Mode.RECORD), emptyparens); + final String columnType = out.ref(getJavaType(column.getReferencingColumn().getType(resolver()))); + final int position = column.getReferencingColumnPosition() - 1; + + if (scala) + out.println("%sget(%s).asInstanceOf[%s]", separator, position, columnType); + else if (kotlin) + out.tab(1).println("%sget(%s) as %s?", separator, position, columnType); + else { + + // [#6705] Avoid generating code with a redundant (Object) cast + if (Object.class.getName().equals(typeFull)) + out.println("%sget(%s)", separator, position); + else + out.println("%s(%s) get(%s)", separator, columnType, position); + } separator = ", "; } diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/DefaultEmbeddableColumnDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/DefaultEmbeddableColumnDefinition.java index 447fbd9534..d3eb58eeae 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/DefaultEmbeddableColumnDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/DefaultEmbeddableColumnDefinition.java @@ -64,6 +64,11 @@ public class DefaultEmbeddableColumnDefinition return referencingColumn; } + @Override + public final int getReferencingColumnPosition() { + return getReferencingColumn().getPosition(); + } + @Override public DataTypeDefinition getType() { return getReferencingColumn().getType(); diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/DefaultEmbeddableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/DefaultEmbeddableDefinition.java index d2df102298..eb4d25f328 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/DefaultEmbeddableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/DefaultEmbeddableDefinition.java @@ -84,7 +84,7 @@ public class DefaultEmbeddableDefinition log.info("Commercial feature", "Embeddables replacing fields is a commercial only feature. Please upgrade to the jOOQ Professional Edition"); for (int i = 0; i < referencingColumns.size(); i++) - embeddableColumns.add(new DefaultEmbeddableColumnDefinition(this, definingColumnNames.get(i), referencingColumns.get(i), i)); + embeddableColumns.add(new DefaultEmbeddableColumnDefinition(this, definingColumnNames.get(i), referencingColumns.get(i), i + 1)); } @Override diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/DefaultMetaTableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/DefaultMetaTableDefinition.java index de68d76424..d4cfaba24f 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/DefaultMetaTableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/DefaultMetaTableDefinition.java @@ -64,7 +64,6 @@ public class DefaultMetaTableDefinition extends AbstractTableDefinition { public List getElements0() throws SQLException { List result = new ArrayList<>(); - int ordinal = 0; for (Field field : table.fields()) { DataType dataType = field.getDataType(); @@ -80,18 +79,14 @@ public class DefaultMetaTableDefinition extends AbstractTableDefinition { (Name) null ); - ColumnDefinition column = new DefaultColumnDefinition( + result.add(new DefaultColumnDefinition( getDatabase().getTable(getSchema(), getName()), field.getName(), - ordinal, + result.size() + 1, type, false, null - ); - - result.add(column); - - ordinal++; + )); } return result; diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/EmbeddableColumnDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/EmbeddableColumnDefinition.java index fb066ee27c..90f09608fd 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/EmbeddableColumnDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/EmbeddableColumnDefinition.java @@ -50,4 +50,10 @@ public interface EmbeddableColumnDefinition extends TypedElementDefinition fDefaultValue = field(name("dflt_value"), String.class); Field fPk = field(name("pk"), int.class); - int position = 0; Table interpreted = null; - for (Record record : create().select(fName, fType, fNotnull, fDefaultValue, fPk) - .from("pragma_table_info({0})", inline(getName())).fetch()) { - position++; + for (Record record : create() + .select(fName, fType, fNotnull, fDefaultValue, fPk) + .from("pragma_table_info({0})", inline(getName())) + ) { String name = record.get(fName); String dataType = record.get(fType) @@ -160,16 +160,14 @@ public class SQLiteTableDefinition extends AbstractTableDefinition { record.get(fDefaultValue) ); - ColumnDefinition column = new DefaultColumnDefinition( + result.add(new DefaultColumnDefinition( getDatabase().getTable(getSchema(), getName()), name, - position, + result.size() + 1, type, identity, null - ); - - result.add(column); + )); } return result;