diff --git a/jOOQ/src/main/java/org/jooq/JSONObjectNullStep.java b/jOOQ/src/main/java/org/jooq/JSONObjectNullStep.java index 832b585316..2ec9a5e58d 100644 --- a/jOOQ/src/main/java/org/jooq/JSONObjectNullStep.java +++ b/jOOQ/src/main/java/org/jooq/JSONObjectNullStep.java @@ -84,7 +84,7 @@ public interface JSONObjectNullStep extends JSONObjectReturningStep { *

* Exclude NULL values in output JSON. */ - @Support({ H2, POSTGRES, YUGABYTEDB }) + @Support({ H2, MYSQL, POSTGRES, YUGABYTEDB }) @NotNull @CheckReturnValue JSONObjectReturningStep absentOnNull(); } diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONObject.java b/jOOQ/src/main/java/org/jooq/impl/JSONObject.java index 42af0a30b5..82974b9d85 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONObject.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONObject.java @@ -207,6 +207,31 @@ implements break; } + case MYSQL: { + + // [#13249] ABSENT ON NULL emulation using JSON_TABLE + if (onNull == JSONOnNull.ABSENT_ON_NULL) { + Field k = DSL.field(name("jt", "k"), VARCHAR); + Field o = DSL.field(name("j", "o"), JSON); + + ctx.visit(DSL.field( + select(DSL.coalesce( + DSL.jsonObjectAgg(k, DSL.function(N_JSON_EXTRACT, JSON, o, DSL.concat(inline("$.\""), k, inline("\"")))), + DSL.jsonObject())) + .from( + select(CustomField.of("o", JSON, c -> acceptStandard(c)).as(o)).asTable("j"), + jsonTable(function(N_JSON_KEYS, JSON, o), inline("$[*]")) + .column("k", VARCHAR).path("$") + .asTable("jt")) + .where(DSL.function(N_JSON_EXTRACT, JSON, o, DSL.concat(inline("$.\""), k, inline("\""))).ne(DSL.inline("null").cast(JSON))) + )); + } + else + acceptStandard(ctx); + + break; + } + default: acceptStandard(ctx); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/Names.java b/jOOQ/src/main/java/org/jooq/impl/Names.java index 27bf8eaaea..bec460af22 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Names.java +++ b/jOOQ/src/main/java/org/jooq/impl/Names.java @@ -183,6 +183,7 @@ final class Names { static final Name N_JSON_EXTRACT = systemName("json_extract"); static final Name N_JSON_GROUP_ARRAY = systemName("json_group_array"); static final Name N_JSON_GROUP_OBJECT = systemName("json_group_object"); + static final Name N_JSON_KEYS = systemName("json_keys"); static final Name N_JSON_MERGE = systemName("json_merge"); static final Name N_JSON_MERGE_PRESERVE = systemName("json_merge_preserve"); static final Name N_JSON_MODIFY = systemName("json_modify"); diff --git a/pom.xml b/pom.xml index 47504f0c43..e166f737c7 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 42.4.1 10.2.0.jre11 - 21.5.0.0 + 21.7.0.0 0.9.1.RELEASE