diff --git a/src/main/java/org/apache/commons/beanutils/ResultSetIterator.java b/src/main/java/org/apache/commons/beanutils/ResultSetIterator.java index 0ed83bca2..82288d0f6 100644 --- a/src/main/java/org/apache/commons/beanutils/ResultSetIterator.java +++ b/src/main/java/org/apache/commons/beanutils/ResultSetIterator.java @@ -264,7 +264,7 @@ public void set(final String name, final Object value) { throw new IllegalArgumentException(name); } try { - dynaClass.getResultSet().updateObject(name, value); + dynaClass.getResultSet().updateObject(dynaClass.getColumnName(name), value); } catch (final SQLException e) { throw new IllegalArgumentException("set(" + name + "): SQLException: " + e, e); } diff --git a/src/test/java/org/apache/commons/beanutils/DynaResultSetTest.java b/src/test/java/org/apache/commons/beanutils/DynaResultSetTest.java index 0fb49eeb8..f43ff2e72 100644 --- a/src/test/java/org/apache/commons/beanutils/DynaResultSetTest.java +++ b/src/test/java/org/apache/commons/beanutils/DynaResultSetTest.java @@ -18,7 +18,10 @@ package org.apache.commons.beanutils; import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.Iterator; +import java.util.concurrent.atomic.AtomicReference; import junit.framework.TestCase; @@ -123,6 +126,28 @@ public void testGetName() { } + /** + * With the default {@code lowerCase} option the property name differs from the real column name, and the read path resolves it through + * {@code getColumnName}. Verify that {@code set} resolves it the same way, so the update targets the real column name and not the lower-cased property + * name. + */ + public void testSetUsesColumnName() throws Exception { + + final AtomicReference updatedColumn = new AtomicReference(); + final ResultSet resultSet = TestResultSet.createProxy(new TestResultSet() { + @Override + public void updateObject(final String columnName, final Object value) throws SQLException { + updatedColumn.set(columnName); + } + }); + final ResultSetDynaClass rsdc = new ResultSetDynaClass(resultSet); + final DynaBean row = rsdc.iterator().next(); + row.set("stringproperty", "new value"); + assertEquals("update targets the real column name", + "stringProperty", updatedColumn.get()); + + } + public void testIteratorCount() { final Iterator rows = dynaClass.iterator();