diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java index 17f767df1f..15dd9ba0ae 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java @@ -68,6 +68,7 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import javax.annotation.Generated; import javax.sql.DataSource; @@ -378,9 +379,10 @@ public class DefaultDSLContext extends AbstractScope implements DSLContext, Seri public List extractBindValues(QueryPart part) { List result = new ArrayList(); - for (Param param : extractParams0(part, false).values()) { - result.add(param.getValue()); - } + ParamCollector collector = new ParamCollector(configuration(), false); + collector.visit(part); + for (Entry> entry : collector.resultList) + result.add(entry.getValue().getValue()); return Collections.unmodifiableList(result); } diff --git a/jOOQ/src/main/java/org/jooq/impl/ParamCollector.java b/jOOQ/src/main/java/org/jooq/impl/ParamCollector.java index 1178bed968..90e599cbc9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParamCollector.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParamCollector.java @@ -41,10 +41,12 @@ package org.jooq.impl; import java.sql.SQLException; +import java.util.AbstractMap.SimpleImmutableEntry; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import org.jooq.BindContext; import org.jooq.Configuration; @@ -62,10 +64,11 @@ import org.jooq.tools.StringUtils; */ class ParamCollector extends AbstractBindContext { - final Map> resultFlat = new LinkedHashMap>(); - final Map>> result = new LinkedHashMap>>(); + final Map> resultFlat = new LinkedHashMap>(); + final Map>> result = new LinkedHashMap>>(); + final List>> resultList = new ArrayList>>(); - private final boolean includeInlinedParams; + private final boolean includeInlinedParams; ParamCollector(Configuration configuration, boolean includeInlinedParams) { super(configuration, null); @@ -81,13 +84,16 @@ class ParamCollector extends AbstractBindContext { // [#3131] Inlined parameters should not be returned in some contexts if (includeInlinedParams || !param.isInline()) { String i = String.valueOf(nextIndex()); + String paramName = param.getParamName(); - if (StringUtils.isBlank(param.getParamName())) { + if (StringUtils.isBlank(paramName)) { resultFlat.put(i, param); + resultList.add(new SimpleImmutableEntry>(i, param)); result(i).add(param); } else { resultFlat.put(param.getParamName(), param); + resultList.add(new SimpleImmutableEntry>(param.getParamName(), param)); result(param.getParamName()).add(param); } } diff --git a/jOOQ/src/test/java/org/jooq/test/ParamTest.java b/jOOQ/src/test/java/org/jooq/test/ParamTest.java index d3b2e31be2..e387edf5a2 100644 --- a/jOOQ/src/test/java/org/jooq/test/ParamTest.java +++ b/jOOQ/src/test/java/org/jooq/test/ParamTest.java @@ -41,7 +41,9 @@ package org.jooq.test; import static java.util.Arrays.asList; +import static java.util.Collections.nCopies; import static org.jooq.impl.DSL.inline; +import static org.jooq.impl.DSL.param; import static org.jooq.impl.DSL.val; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -78,4 +80,14 @@ public class ParamTest extends AbstractTest { assertEquals(asList(1, 3), query.getBindValues()); } + + @Test + public void testNamedBindValues() { + Query query = create.select(param("a"), param("a")).where(param("b").eq(param("b"))); + assertEquals(nCopies(4, null), query.getBindValues()); + + query.bind("a", 1); + query.bind("b", 2); + assertEquals(asList(1, 1, 2, 2), query.getBindValues()); + } }