diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/DefaultJdbcClient.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/DefaultJdbcClient.java index 5275de7c544..b9b44bd73ad 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/DefaultJdbcClient.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/DefaultJdbcClient.java @@ -205,7 +205,7 @@ final class DefaultJdbcClient implements JdbcClient { @Override public void query(RowCallbackHandler rch) { if (useNamedParams()) { - namedParamOps.query(this.sql, this.namedParams, rch); + namedParamOps.query(this.sql, this.namedParamSource, rch); } else { classicOps.query(getPreparedStatementCreatorForIndexedParams(), rch); @@ -215,7 +215,7 @@ final class DefaultJdbcClient implements JdbcClient { @Override public T query(ResultSetExtractor rse) { T result = (useNamedParams() ? - namedParamOps.query(this.sql, this.namedParams, rse) : + namedParamOps.query(this.sql, this.namedParamSource, rse) : classicOps.query(getPreparedStatementCreatorForIndexedParams(), rse)); Assert.state(result != null, "No result from ResultSetExtractor"); return result; diff --git a/spring-jdbc/src/test/java/org/springframework/jdbc/core/simple/JdbcClientNamedParameterTests.java b/spring-jdbc/src/test/java/org/springframework/jdbc/core/simple/JdbcClientNamedParameterTests.java index f2fe53beb2b..a350d9bc70f 100644 --- a/spring-jdbc/src/test/java/org/springframework/jdbc/core/simple/JdbcClientNamedParameterTests.java +++ b/spring-jdbc/src/test/java/org/springframework/jdbc/core/simple/JdbcClientNamedParameterTests.java @@ -38,6 +38,7 @@ import org.junit.jupiter.api.Test; import org.springframework.jdbc.Customer; import org.springframework.jdbc.core.SqlParameterValue; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; @@ -89,6 +90,8 @@ public class JdbcClientNamedParameterTests { private Map params = new HashMap<>(); + private MapSqlParameterSource paramSource = new MapSqlParameterSource(); + @BeforeEach public void setup() throws Exception { @@ -128,6 +131,33 @@ public class JdbcClientNamedParameterTests { verify(connection).close(); } + @Test + public void testQueryWithResultSetExtractorParameterSource() throws SQLException { + given(resultSet.next()).willReturn(true); + given(resultSet.getInt("id")).willReturn(1); + given(resultSet.getString("forename")).willReturn("rod"); + + paramSource.addValue("id", new SqlParameterValue(Types.DECIMAL, 1)); + paramSource.addValue("country", "UK"); + Customer cust = client.sql(SELECT_NAMED_PARAMETERS).paramSource(paramSource).query( + rs -> { + rs.next(); + Customer cust1 = new Customer(); + cust1.setId(rs.getInt(COLUMN_NAMES[0])); + cust1.setForename(rs.getString(COLUMN_NAMES[1])); + return cust1; + }); + + assertThat(cust.getId()).as("Customer id was assigned correctly").isEqualTo(1); + assertThat(cust.getForename()).as("Customer forename was assigned correctly").isEqualTo("rod"); + verify(connection).prepareStatement(SELECT_NAMED_PARAMETERS_PARSED); + verify(preparedStatement).setObject(1, 1, Types.DECIMAL); + verify(preparedStatement).setString(2, "UK"); + verify(resultSet).close(); + verify(preparedStatement).close(); + verify(connection).close(); + } + @Test public void testQueryWithResultSetExtractorNoParameters() throws SQLException { given(resultSet.next()).willReturn(true); @@ -178,6 +208,33 @@ public class JdbcClientNamedParameterTests { verify(connection).close(); } + @Test + public void testQueryWithRowCallbackHandlerParameterSource() throws SQLException { + given(resultSet.next()).willReturn(true, false); + given(resultSet.getInt("id")).willReturn(1); + given(resultSet.getString("forename")).willReturn("rod"); + + paramSource.addValue("id", new SqlParameterValue(Types.DECIMAL, 1)); + paramSource.addValue("country", "UK"); + final List customers = new ArrayList<>(); + client.sql(SELECT_NAMED_PARAMETERS).paramSource(paramSource).query(rs -> { + Customer cust = new Customer(); + cust.setId(rs.getInt(COLUMN_NAMES[0])); + cust.setForename(rs.getString(COLUMN_NAMES[1])); + customers.add(cust); + }); + + assertThat(customers).hasSize(1); + assertThat(customers.get(0).getId()).as("Customer id was assigned correctly").isEqualTo(1); + assertThat(customers.get(0).getForename()).as("Customer forename was assigned correctly").isEqualTo("rod"); + verify(connection).prepareStatement(SELECT_NAMED_PARAMETERS_PARSED); + verify(preparedStatement).setObject(1, 1, Types.DECIMAL); + verify(preparedStatement).setString(2, "UK"); + verify(resultSet).close(); + verify(preparedStatement).close(); + verify(connection).close(); + } + @Test public void testQueryWithRowCallbackHandlerNoParameters() throws SQLException { given(resultSet.next()).willReturn(true, false);