diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONArray.java b/jOOQ/src/main/java/org/jooq/impl/JSONArray.java index 490d29bb38..879da26648 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONArray.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONArray.java @@ -43,6 +43,7 @@ import static org.jooq.impl.DSL.row; import static org.jooq.impl.DSL.select; import static org.jooq.impl.DSL.unquotedName; import static org.jooq.impl.DSL.values; +import static org.jooq.impl.JSONEntryImpl.jsonCastMapper; import static org.jooq.impl.JSONNull.JSONNullType.ABSENT_ON_NULL; import static org.jooq.impl.JSONNull.JSONNullType.NULL_ON_NULL; import static org.jooq.impl.Keywords.K_JSON_ARRAY; @@ -115,8 +116,10 @@ final class JSONArray extends AbstractField implements JSONArrayNullStep t = values(rows).as("t", "a"); Field a = t.field("a"); ctx.visit(DSL.field(select(jsonArrayAgg(a)).from(t).where(a.isNotNull()))); @@ -136,7 +139,7 @@ final class JSONArray extends AbstractField implements JSONArrayNullStep { private final void acceptStandard(Context ctx) { ctx.visit(N_JSON_ARRAYAGG).sql('('); - ctx.visit(arguments.get(0)); + ctx.visit(jsonCast(ctx, arguments.get(0))); acceptOrderBy(ctx); JSONNull jsonNull = new JSONNull(nullType); diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONEntryImpl.java b/jOOQ/src/main/java/org/jooq/impl/JSONEntryImpl.java index b5f969e361..25c828bfea 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONEntryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONEntryImpl.java @@ -42,8 +42,12 @@ import static org.jooq.impl.Keywords.K_FORMAT; import static org.jooq.impl.Keywords.K_JSON; import static org.jooq.impl.Keywords.K_KEY; import static org.jooq.impl.Keywords.K_VALUE; +import static org.jooq.impl.SQLDataType.VARCHAR; + +import java.util.UUID; import org.jooq.Context; +import org.jooq.DataType; import org.jooq.Field; import org.jooq.JSONEntry; @@ -106,8 +110,32 @@ final class JSONEntryImpl extends AbstractQueryPart implements JSONEntry { break; default: - ctx.visit(K_KEY).sql(' ').visit(key).sql(' ').visit(K_VALUE).sql(' ').visit(value); + ctx.visit(K_KEY).sql(' ').visit(key).sql(' ').visit(K_VALUE).sql(' ').visit(jsonCast(ctx, value)); break; } } + + static final F1, Field> jsonCastMapper(final Context ctx) { + return new F1, Field>() { + @Override + public Field apply(Field field) { + return jsonCast(ctx, field); + } + }; + } + + static final Field jsonCast(Context ctx, Field field) { + switch (ctx.family()) { + + // [#10769] Some dialects don't support auto conversions from X to JSON + case H2: { + DataType type = field.getDataType(); + + if (type.getType() == UUID.class) + return field.cast(VARCHAR(36)); + } + } + + return field; + } } diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONObject.java b/jOOQ/src/main/java/org/jooq/impl/JSONObject.java index d44ecc05cf..f67ec001d7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONObject.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONObject.java @@ -54,8 +54,10 @@ import static org.jooq.impl.Names.N_JSON_MERGE; import static org.jooq.impl.Names.N_JSON_OBJECT; import static org.jooq.impl.Names.N_T; import static org.jooq.impl.QueryPartListView.wrap; +import static org.jooq.impl.SQLDataType.VARCHAR; import java.util.Collection; +import java.util.UUID; import org.jooq.Context; import org.jooq.DataType;