diff --git a/querydsl-core/src/main/java/com/querydsl/core/types/FactoryExpressionUtils.java b/querydsl-core/src/main/java/com/querydsl/core/types/FactoryExpressionUtils.java index 48f01b13b..c0d6b42f1 100644 --- a/querydsl-core/src/main/java/com/querydsl/core/types/FactoryExpressionUtils.java +++ b/querydsl-core/src/main/java/com/querydsl/core/types/FactoryExpressionUtils.java @@ -16,8 +16,6 @@ package com.querydsl.core.types; import java.util.ArrayList; import java.util.List; -import com.querydsl.core.util.ArrayUtils; - /** * Utility class to expand {@link FactoryExpression} constructor arguments and compress {@link FactoryExpression} * invocation arguments @@ -59,7 +57,7 @@ public final class FactoryExpressionUtils { @Override public T newInstance(Object... a) { - return inner.newInstance(compress(inner.getArgs(), a)); + return inner.newInstance(compress(inner.getArgs(), a, 0)); } @Override @@ -140,7 +138,7 @@ public final class FactoryExpressionUtils { return counter; } - private static Object[] compress(List> exprs, Object[] args) { + private static Object[] compress(List> exprs, Object[] args, int from) { Object[] rv = new Object[exprs.size()]; int offset = 0; for (int i = 0; i < exprs.size(); i++) { @@ -151,11 +149,11 @@ public final class FactoryExpressionUtils { if (expr instanceof FactoryExpression) { FactoryExpression fe = (FactoryExpression) expr; int fullArgsLength = countArguments(fe); - Object[] compressed = compress(fe.getArgs(), ArrayUtils.subarray(args, offset, offset + fullArgsLength)); + Object[] compressed = compress(fe.getArgs(), args, offset); rv[i] = fe.newInstance(compressed); offset += fullArgsLength; } else { - rv[i] = args[offset]; + rv[i] = args[from + offset]; offset++; } } diff --git a/querydsl-sql/src/main/java/com/querydsl/sql/AbstractSQLQuery.java b/querydsl-sql/src/main/java/com/querydsl/sql/AbstractSQLQuery.java index 938b09fea..713c4228e 100644 --- a/querydsl-sql/src/main/java/com/querydsl/sql/AbstractSQLQuery.java +++ b/querydsl-sql/src/main/java/com/querydsl/sql/AbstractSQLQuery.java @@ -20,12 +20,14 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; +import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.annotation.Nullable; import javax.inject.Provider; +import com.querydsl.sql.types.Type; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; @@ -447,15 +449,17 @@ public abstract class AbstractSQLQuery> exte listeners.executed(context); try { lastCell = null; - final List rv = new ArrayList(); + final List rv = new LinkedList(); if (expr instanceof FactoryExpression) { FactoryExpression fe = (FactoryExpression) expr; + List> types = getTypesFromExpressions(fe.getArgs()); + int sizeOfTypes = types.size(); while (rs.next()) { if (getLastCell) { lastCell = rs.getObject(fe.getArgs().size() + 1); getLastCell = false; } - rv.add(newInstance(fe, rs, 0)); + rv.add(fe.newInstance(populateArguments(sizeOfTypes, types, rs))); } } else if (expr.equals(Wildcard.all)) { while (rs.next()) { @@ -470,12 +474,14 @@ public abstract class AbstractSQLQuery> exte rv.add((T) row); } } else { + Path path = (expr instanceof Path) ? (Path) expr : null; + Type type = configuration.getType(path, expr.getType()); while (rs.next()) { if (getLastCell) { lastCell = rs.getObject(2); getLastCell = false; } - rv.add(get(rs, expr, 1, expr.getType())); + rv.add(configuration.get(rs, 1, type)); } } return rv; @@ -562,6 +568,26 @@ public abstract class AbstractSQLQuery> exte return c.newInstance(args); } + private Object[] populateArguments(int typesSize, List> types, ResultSet rs) + throws InstantiationException, IllegalAccessException, InvocationTargetException, SQLException { + Object[] args = new Object[typesSize]; + int i = 0; + for (Type type : types) { + args[i] = type.getValue(rs, ++i); + } + return args; + } + + private List> getTypesFromExpressions(List> expressions) { + List> types = new ArrayList>(); + for (Expression e : expressions) { + Path path = e instanceof Path ? (Path) e : null; + Type t = configuration.getType(path, e.getType()); + types.add(t); + } + return types; + } + private void reset() { cleanupMDC(); } diff --git a/querydsl-sql/src/main/java/com/querydsl/sql/Configuration.java b/querydsl-sql/src/main/java/com/querydsl/sql/Configuration.java index 69826b064..6d2b43401 100644 --- a/querydsl-sql/src/main/java/com/querydsl/sql/Configuration.java +++ b/querydsl-sql/src/main/java/com/querydsl/sql/Configuration.java @@ -195,6 +195,11 @@ public final class Configuration { return getType(path, clazz).getValue(rs, i); } + @Nullable + public T get(ResultSet rs,int i, Type type) throws SQLException { + return type.getValue(rs, i); + } + /** * Get the schema/table override * @@ -269,7 +274,7 @@ public final class Configuration { } @SuppressWarnings({ "unchecked", "rawtypes" }) - private Type getType(@Nullable Path path, Class clazz) { + Type getType(@Nullable Path path, Class clazz) { if (hasTableColumnTypes && path != null && !clazz.equals(Null.class) && path.getMetadata().getParent() instanceof RelationalPath) { String table = ((RelationalPath) path.getMetadata().getParent()).getTableName();