From a2660a9166b745107913f9ecdb3765a1de886697 Mon Sep 17 00:00:00 2001 From: Naveed Khan Date: Fri, 24 Jul 2026 14:43:58 +0530 Subject: [PATCH] resolve column name in ResultSetIterator.set (1.X) port of #426. the read path resolves the dyna-property name to the real column name via getColumnName, but set passed the raw name to updateObject, so with the default lowerCase a mixed-case column update targeted the wrong column. Same fix and regression test as master, adapted to the JUnit 3 style on this branch. --- .../commons/beanutils/ResultSetIterator.java | 2 +- .../commons/beanutils/DynaResultSetTest.java | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) 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();