From 67f4a83d715ffbaecb23eb62c96814a0b4ab8f7a Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 27 Mar 2024 18:05:27 +0100 Subject: [PATCH] [jOOQ/jOOQ#15732] Support nested MULTISET --- jOOQ/src/main/java/org/jooq/impl/ListHandler.java | 11 +++++++---- jOOQ/src/main/java/org/jooq/impl/RecordDataType.java | 8 +++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/ListHandler.java b/jOOQ/src/main/java/org/jooq/impl/ListHandler.java index ebdc99ecfb..09de3df1b9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ListHandler.java +++ b/jOOQ/src/main/java/org/jooq/impl/ListHandler.java @@ -40,6 +40,7 @@ package org.jooq.impl; import static java.util.Arrays.asList; import static org.jooq.impl.Tools.newRecord; +import java.sql.Array; import java.sql.SQLException; import java.sql.Struct; import java.util.List; @@ -78,10 +79,12 @@ final class ListHandler { for (int i = 0; i < attributes.length && i < row.size(); i++) { DataType t = row.field(i).getDataType(); - if (t.isMultiset() && attributes[i] instanceof List) - attributes[i] = new ListHandler(ctx, (AbstractRow) t.getRow(), t.getRecordType()).read((List) attributes[i]); - else if (t.isRecord() && attributes[i] instanceof Struct) - attributes[i] = new ListHandler(ctx, (AbstractRow) t.getRow(), t.getRecordType()).read(asList((Struct) attributes[i])).get(0); + if (t.isMultiset() && attributes[i] instanceof List l) + attributes[i] = new ListHandler(ctx, (AbstractRow) t.getRow(), t.getRecordType()).read(l); + else if (t.isMultiset() && attributes[i] instanceof Array a) + attributes[i] = new ListHandler(ctx, (AbstractRow) t.getRow(), t.getRecordType()).read(asList((Object[]) a.getArray())); + else if (t.isRecord() && attributes[i] instanceof Struct x) + attributes[i] = new ListHandler(ctx, (AbstractRow) t.getRow(), t.getRecordType()).read(asList(x)).get(0); } r.fromArray(attributes); diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordDataType.java b/jOOQ/src/main/java/org/jooq/impl/RecordDataType.java index 62af955ca5..5d0c963975 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordDataType.java @@ -43,6 +43,7 @@ import static org.jooq.impl.Tools.CONFIG; import static org.jooq.impl.Tools.newRecord; import static org.jooq.impl.Tools.recordType; +import java.sql.Struct; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -164,7 +165,12 @@ final class RecordDataType extends DefaultDataType { return (R) object; // [#12116] TODO: Move this logic into JSONReader to make it more generally useful - else if (object instanceof Record || object instanceof Map || object instanceof List) { + else if ( + object instanceof Record + || object instanceof Map + || object instanceof List + || object instanceof Struct + ) { return newRecord(true, getRecordType(), row, CONFIG.get()) .operate(r -> {