diff --git a/jOOQ/src/main/java/org/jooq/InsertOnDuplicateSetStep.java b/jOOQ/src/main/java/org/jooq/InsertOnDuplicateSetStep.java index e0d1d3212e..959674ef22 100644 --- a/jOOQ/src/main/java/org/jooq/InsertOnDuplicateSetStep.java +++ b/jOOQ/src/main/java/org/jooq/InsertOnDuplicateSetStep.java @@ -90,12 +90,15 @@ public interface InsertOnDuplicateSetStep { * Set multiple values for UPDATE in the INSERT * statement's ON DUPLICATE KEY UPDATE clause. *

+ * Keys can either be of type {@link String}, {@link Name}, or + * {@link Field}. + *

* Values can either be of type <T> or * Field<T>. jOOQ will attempt to convert values to their * corresponding field's type. */ @Support({ CUBRID, HSQLDB, MARIADB, MYSQL, POSTGRES_9_5 }) - InsertOnDuplicateSetMoreStep set(Map, ?> map); + InsertOnDuplicateSetMoreStep set(Map map); /** * Set multiple values for UPDATE in the INSERT diff --git a/jOOQ/src/main/java/org/jooq/InsertQuery.java b/jOOQ/src/main/java/org/jooq/InsertQuery.java index 639232dd1d..c742226dee 100644 --- a/jOOQ/src/main/java/org/jooq/InsertQuery.java +++ b/jOOQ/src/main/java/org/jooq/InsertQuery.java @@ -214,7 +214,7 @@ public interface InsertQuery extends StoreQuery, Insert * @see InsertOnDuplicateStep#onDuplicateKeyUpdate() */ @Support({ CUBRID, HSQLDB, MARIADB, MYSQL, POSTGRES_9_5 }) - void addValuesForUpdate(Map, ?> map); + void addValuesForUpdate(Map map); /** * Adds new conditions to the query, connecting them to existing conditions diff --git a/jOOQ/src/main/java/org/jooq/InsertSetMoreStep.java b/jOOQ/src/main/java/org/jooq/InsertSetMoreStep.java index 17b33c68e2..e2b4074ded 100644 --- a/jOOQ/src/main/java/org/jooq/InsertSetMoreStep.java +++ b/jOOQ/src/main/java/org/jooq/InsertSetMoreStep.java @@ -79,12 +79,15 @@ public interface InsertSetMoreStep extends InsertOnDuplicateSt /** * Set values in the INSERT statement. *

+ * Keys can either be of type {@link String}, {@link Name}, or + * {@link Field}. + *

* Values can either be of type <T> or * Field<T>. jOOQ will attempt to convert values to their * corresponding field's type. */ @Support - InsertSetMoreStep set(Map, ?> map); + InsertSetMoreStep set(Map map); /** * Set values in the INSERT statement. diff --git a/jOOQ/src/main/java/org/jooq/InsertSetStep.java b/jOOQ/src/main/java/org/jooq/InsertSetStep.java index f48ae0efcc..f06e7f3297 100644 --- a/jOOQ/src/main/java/org/jooq/InsertSetStep.java +++ b/jOOQ/src/main/java/org/jooq/InsertSetStep.java @@ -268,12 +268,15 @@ public interface InsertSetStep { /** * Set values in the INSERT statement. *

+ * Keys can either be of type {@link String}, {@link Name}, or + * {@link Field}. + *

* Values can either be of type <T> or * Field<T>. jOOQ will attempt to convert values to their * corresponding field's type. */ @Support - InsertSetMoreStep set(Map, ?> map); + InsertSetMoreStep set(Map map); /** * Set values in the INSERT statement. diff --git a/jOOQ/src/main/java/org/jooq/MergeMatchedSetStep.java b/jOOQ/src/main/java/org/jooq/MergeMatchedSetStep.java index d5f6c34b3d..df71723ce7 100644 --- a/jOOQ/src/main/java/org/jooq/MergeMatchedSetStep.java +++ b/jOOQ/src/main/java/org/jooq/MergeMatchedSetStep.java @@ -90,12 +90,15 @@ public interface MergeMatchedSetStep { * Set multiple values for UPDATE in the MERGE * statement's WHEN MATCHED clause. *

+ * Keys can either be of type {@link String}, {@link Name}, or + * {@link Field}. + *

* Values can either be of type <T> or * Field<T>. jOOQ will attempt to convert values to their * corresponding field's type. */ @Support({ CUBRID, FIREBIRD_3_0, HSQLDB }) - MergeMatchedSetMoreStep set(Map, ?> map); + MergeMatchedSetMoreStep set(Map map); /** * Set multiple values for UPDATE in the MERGE diff --git a/jOOQ/src/main/java/org/jooq/MergeNotMatchedSetStep.java b/jOOQ/src/main/java/org/jooq/MergeNotMatchedSetStep.java index d44923c630..34935de355 100644 --- a/jOOQ/src/main/java/org/jooq/MergeNotMatchedSetStep.java +++ b/jOOQ/src/main/java/org/jooq/MergeNotMatchedSetStep.java @@ -90,12 +90,15 @@ public interface MergeNotMatchedSetStep { * Set multiple values for INSERT in the MERGE * statement's WHEN NOT MATCHED clause. *

+ * Keys can either be of type {@link String}, {@link Name}, or + * {@link Field}. + *

* Values can either be of type <T> or * Field<T>. jOOQ will attempt to convert values to their * corresponding field's type. */ @Support({ CUBRID, FIREBIRD_3_0, HSQLDB }) - MergeNotMatchedSetMoreStep set(Map, ?> map); + MergeNotMatchedSetMoreStep set(Map map); /** * Set multiple values for INSERT in the MERGE diff --git a/jOOQ/src/main/java/org/jooq/StoreQuery.java b/jOOQ/src/main/java/org/jooq/StoreQuery.java index c2c6d6a0f2..9d61c86850 100644 --- a/jOOQ/src/main/java/org/jooq/StoreQuery.java +++ b/jOOQ/src/main/java/org/jooq/StoreQuery.java @@ -76,12 +76,15 @@ public interface StoreQuery extends Query { /** * Add multiple values to the store statement. *

+ * Keys can either be of type {@link String}, {@link Name}, or + * {@link Field}. + *

* Values can either be of type <T> or * Field<T>. jOOQ will attempt to convert values to their * corresponding field's type. */ @Support - void addValues(Map, ?> map); + void addValues(Map map); /** * Configure the INSERT or UPDATE statement to return all fields in diff --git a/jOOQ/src/main/java/org/jooq/UpdateSetStep.java b/jOOQ/src/main/java/org/jooq/UpdateSetStep.java index b4694855c9..e972a5a792 100644 --- a/jOOQ/src/main/java/org/jooq/UpdateSetStep.java +++ b/jOOQ/src/main/java/org/jooq/UpdateSetStep.java @@ -74,12 +74,15 @@ public interface UpdateSetStep { /** * Set a value for a field in the UPDATE statement. *

+ * Keys can either be of type {@link String}, {@link Name}, or + * {@link Field}. + *

* Values can either be of type <T> or * Field<T>. jOOQ will attempt to convert values to their * corresponding field's type. */ @Support - UpdateSetMoreStep set(Map, ?> map); + UpdateSetMoreStep set(Map map); /** * Set a value for a field in the UPDATE statement. diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java index 3b68e40e30..62ac95c856 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java @@ -164,7 +164,7 @@ class DefaultRenderContext extends AbstractContext implements Ren @Override public final String render() { - String prepend = (String) data(DataKey.DATA_PREPEND_SQL); + String prepend = null; String result = sql.toString(); return prepend == null ? result : prepend + result; } diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java b/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java index d73489cb32..d083169440 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java @@ -45,6 +45,7 @@ import java.util.Map; import org.jooq.Clause; import org.jooq.Context; import org.jooq.Field; +import org.jooq.Table; /** * @author Lukas Eder @@ -56,9 +57,11 @@ final class FieldMapForUpdate extends AbstractQueryPartMap, Field> { */ private static final long serialVersionUID = -6139709404698673799L; + private final Table table; private final Clause assignmentClause; - FieldMapForUpdate(Clause assignmentClause) { + FieldMapForUpdate(Table table, Clause assignmentClause) { + this.table = table; this.assignmentClause = assignmentClause; } @@ -104,12 +107,12 @@ final class FieldMapForUpdate extends AbstractQueryPartMap, Field> { return null; } - final void set(Map, ?> map) { - for (Entry, ?> entry : map.entrySet()) { - Field field = entry.getKey(); + final void set(Map map) { + for (Entry entry : map.entrySet()) { + Field field = Tools.tableField(table, entry.getKey()); Object value = entry.getValue(); - put(entry.getKey(), Tools.field(value, field)); + put(field, Tools.field(value, field)); } } } diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java b/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java index a962e6d73d..7ee7e0196e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java @@ -60,6 +60,7 @@ import org.jooq.Context; import org.jooq.Field; import org.jooq.Record; import org.jooq.Select; +import org.jooq.Table; import org.jooq.impl.AbstractStoreQuery.UnknownField; /** @@ -72,13 +73,15 @@ final class FieldMapsForInsert extends AbstractQueryPart { */ private static final long serialVersionUID = -6227074228534414225L; + final Table table; final List> empty; final Map, List>> values; int rows; - FieldMapsForInsert() { - values = new LinkedHashMap, List>>(); - empty = new ArrayList>(); + FieldMapsForInsert(Table table) { + this.table = table; + this.values = new LinkedHashMap, List>>(); + this.empty = new ArrayList>(); } // ------------------------------------------------------------------------- @@ -219,16 +222,17 @@ final class FieldMapsForInsert extends AbstractQueryPart { // The FieldMapsForInsert API // ------------------------------------------------------------------------- - final void addFields(Collection> fields) { + final void addFields(Collection fields) { if (rows == 0) newRecord(); - for (Field field : fields) { - Field e = DSL.val(null, field); + for (Object field : fields) { + Field f = Tools.tableField(table, field); + Field e = DSL.val(null, f); empty.add(e); - if (!values.containsKey(field)) { - values.put(field, rows > 0 + if (!values.containsKey(f)) { + values.put(f, rows > 0 ? new ArrayList>(Collections.nCopies(rows, e)) : new ArrayList>() ); @@ -253,11 +257,13 @@ final class FieldMapsForInsert extends AbstractQueryPart { return (Field) values.get(field).set(rows - 1, value); } - final void set(Map, ?> map) { + final void set(Map map) { addFields(map.keySet()); - for (Entry, ?> entry : map.entrySet()) - values.get(entry.getKey()) - .set(rows - 1, Tools.field(entry.getValue(), entry.getKey())); + for (Entry entry : map.entrySet()) { + Field field = Tools.tableField(table, entry.getKey()); + values.get(field) + .set(rows - 1, Tools.field(entry.getValue(), field)); + } } final void newRecord() { diff --git a/jOOQ/src/main/java/org/jooq/impl/InsertImpl.java b/jOOQ/src/main/java/org/jooq/impl/InsertImpl.java index c5af3609de..4950bb2b7b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InsertImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/InsertImpl.java @@ -59,14 +59,6 @@ import org.jooq.InsertResultStep; import org.jooq.InsertSetMoreStep; import org.jooq.InsertSetStep; import org.jooq.InsertValuesStep1; -import org.jooq.InsertValuesStep2; -import org.jooq.InsertValuesStep3; -import org.jooq.InsertValuesStep4; -import org.jooq.InsertValuesStep5; -import org.jooq.InsertValuesStep6; -import org.jooq.InsertValuesStep7; -import org.jooq.InsertValuesStep8; -import org.jooq.InsertValuesStep9; import org.jooq.InsertValuesStep10; import org.jooq.InsertValuesStep11; import org.jooq.InsertValuesStep12; @@ -77,9 +69,17 @@ import org.jooq.InsertValuesStep16; import org.jooq.InsertValuesStep17; import org.jooq.InsertValuesStep18; import org.jooq.InsertValuesStep19; +import org.jooq.InsertValuesStep2; import org.jooq.InsertValuesStep20; import org.jooq.InsertValuesStep21; import org.jooq.InsertValuesStep22; +import org.jooq.InsertValuesStep3; +import org.jooq.InsertValuesStep4; +import org.jooq.InsertValuesStep5; +import org.jooq.InsertValuesStep6; +import org.jooq.InsertValuesStep7; +import org.jooq.InsertValuesStep8; +import org.jooq.InsertValuesStep9; import org.jooq.InsertValuesStepN; import org.jooq.Operator; import org.jooq.QueryPart; @@ -660,7 +660,7 @@ class InsertImpl, ?> map) { + public final InsertImpl set(Map map) { if (onDuplicateKeyUpdate) { getDelegate().addValuesForUpdate(map); } diff --git a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java index 504a3f367f..a619e8b7ac 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java @@ -112,8 +112,8 @@ final class InsertQueryImpl extends AbstractStoreQuery impl InsertQueryImpl(Configuration configuration, WithImpl with, Table into) { super(configuration, with, into); - this.updateMap = new FieldMapForUpdate(INSERT_ON_DUPLICATE_KEY_UPDATE_ASSIGNMENT); - this.insertMaps = new FieldMapsForInsert(); + this.updateMap = new FieldMapForUpdate(into, INSERT_ON_DUPLICATE_KEY_UPDATE_ASSIGNMENT); + this.insertMaps = new FieldMapsForInsert(into); this.condition = new ConditionProviderImpl(); } @@ -166,7 +166,7 @@ final class InsertQueryImpl extends AbstractStoreQuery impl } @Override - public final void addValuesForUpdate(Map, ?> map) { + public final void addValuesForUpdate(Map map) { updateMap.set(map); } @@ -202,7 +202,7 @@ final class InsertQueryImpl extends AbstractStoreQuery impl } @Override - public final void addValues(Map, ?> map) { + public final void addValues(Map map) { insertMaps.set(map); } @@ -339,7 +339,7 @@ final class InsertQueryImpl extends AbstractStoreQuery impl // CUBRID can emulate this using ON DUPLICATE KEY UPDATE case CUBRID: { - FieldMapForUpdate update = new FieldMapForUpdate(INSERT_ON_DUPLICATE_KEY_UPDATE_ASSIGNMENT); + FieldMapForUpdate update = new FieldMapForUpdate(table, INSERT_ON_DUPLICATE_KEY_UPDATE_ASSIGNMENT); Field field = table.field(0); update.put(field, field); diff --git a/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java b/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java index 6879223266..3f82188d6a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java @@ -920,7 +920,7 @@ implements @Override public final MergeImpl whenMatchedThenUpdate() { matchedClause = true; - matchedUpdate = new FieldMapForUpdate(MERGE_SET_ASSIGNMENT); + matchedUpdate = new FieldMapForUpdate(table, MERGE_SET_ASSIGNMENT); notMatchedClause = false; return this; @@ -955,7 +955,7 @@ implements } @Override - public final MergeImpl set(Map, ?> map) { + public final MergeImpl set(Map map) { if (matchedClause) { matchedUpdate.set(map); } @@ -1124,7 +1124,7 @@ implements @Override public final MergeImpl whenNotMatchedThenInsert(Collection> fields) { notMatchedClause = true; - notMatchedInsert = new FieldMapsForInsert(); + notMatchedInsert = new FieldMapsForInsert(table); notMatchedInsert.addFields(fields); matchedClause = false; diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 18b14753bf..260575c84a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -3891,4 +3891,15 @@ final class Tools { updateCounts = 0; data.put(key, updateCounts + 1); } + + static Field tableField(Table table, Object field) { + if (field instanceof Field) + return (Field) field; + else if (field instanceof Name) + return table.field((Name) field); + else if (field instanceof String) + return table.field((String) field); + else + throw new IllegalArgumentException("Field type not supported: " + field); + } } diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdateImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdateImpl.java index f62e114f01..cbeceb0031 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdateImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdateImpl.java @@ -155,7 +155,7 @@ final class UpdateImpl } @Override - public final UpdateImpl set(Map, ?> map) { + public final UpdateImpl set(Map map) { getDelegate().addValues(map); return this; } diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java index e1f946b79d..9946eb4362 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java @@ -62,7 +62,6 @@ import org.jooq.Clause; import org.jooq.Condition; import org.jooq.Configuration; import org.jooq.Context; -import org.jooq.Field; import org.jooq.Operator; import org.jooq.Record; import org.jooq.Record1; @@ -134,7 +133,7 @@ final class UpdateQueryImpl extends AbstractStoreQuery impl UpdateQueryImpl(Configuration configuration, WithImpl with, Table table) { super(configuration, with, table); - this.updateMap = new FieldMapForUpdate(UPDATE_SET_ASSIGNMENT); + this.updateMap = new FieldMapForUpdate(table, UPDATE_SET_ASSIGNMENT); this.from = new TableList(); this.condition = new ConditionProviderImpl(); } @@ -435,7 +434,7 @@ final class UpdateQueryImpl extends AbstractStoreQuery impl } @Override - public final void addValues(Map, ?> map) { + public final void addValues(Map map) { updateMap.set(map); }