This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 643585df3af9aac4433b6bb6723d42da056896db
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sun Jun 28 17:48:32 2026 -0400

    cleanup
---
 .../reader/CryptoRowReaderFactoryDecorator.java    |   6 +-
 .../transformer/DefaultBindingsTransformer.java    |   4 +-
 .../transformer/DefaultTransformerFactory.java     |   2 +-
 .../merge/token/DefaultValueForNullProvider.java   |   2 +-
 .../cayenne/dbsync/merge/token/ValueForNullIT.java |   2 +-
 .../org/apache/cayenne/velocity/BindDirective.java |   4 +-
 .../apache/cayenne/velocity/ResultDirective.java   |   2 +-
 .../VelocitySQLTemplateTranslatorTest.java         |   2 +-
 .../VelocitySQLTemplateTranslator_SelectTest.java  |  20 +--
 .../cayenne/access/PrefetchProcessorJointNode.java |  10 +-
 .../apache/cayenne/access/jdbc/BatchAction.java    |   2 +-
 .../cayenne/access/jdbc/PSBatchParameter.java      |   8 +-
 .../apache/cayenne/access/jdbc/PSParameter.java    |  11 +-
 .../cayenne/access/jdbc/ProcedureAction.java       |   2 +-
 .../org/apache/cayenne/access/jdbc/RSColumn.java   |  36 ++---
 .../cayenne/access/jdbc/SQLTemplateAction.java     |   2 +-
 .../apache/cayenne/access/jdbc/SelectAction.java   |   2 +-
 .../cayenne/access/jdbc/reader/BaseRowReader.java  |  10 +-
 .../jdbc/reader/DefaultRowReaderFactory.java       | 156 +++++++++++----------
 .../access/jdbc/reader/EmbeddableRowReader.java    |  38 ++---
 .../access/jdbc/reader/EntityRowReader.java        |  10 +-
 .../cayenne/access/jdbc/reader/FullRowReader.java  |  14 +-
 .../cayenne/access/jdbc/reader/IdRowReader.java    |   6 +-
 .../access/jdbc/reader/ScalarRowReader.java        |  20 ++-
 .../access/sqlbuilder/sqltree/ValueNode.java       |   8 +-
 .../translator/batch/BaseBatchTranslator.java      |   2 +-
 .../translator/batch/DeleteBatchTranslator.java    |   2 +-
 .../translator/batch/InsertBatchTranslator.java    |   2 +-
 .../batch/SoftDeleteBatchTranslator.java           |   2 +-
 .../translator/batch/UpdateBatchTranslator.java    |   4 +-
 .../procedure/DefaultProcedureTranslator.java      |  12 +-
 .../translator/select/ColumnDescriptorStage.java   |   2 +-
 .../access/translator/sqltemplate/Context.java     |   4 +-
 .../translator/sqltemplate/directive/Result.java   |   2 +-
 .../java/org/apache/cayenne/dba/JdbcAdapter.java   |  10 +-
 .../org/apache/cayenne/dba/db2/DB2Adapter.java     |   4 +-
 .../org/apache/cayenne/dba/derby/DerbyAdapter.java |   4 +-
 .../apache/cayenne/dba/ingres/IngresAdapter.java   |   4 +-
 .../apache/cayenne/dba/oracle/OracleAdapter.java   |   8 +-
 .../cayenne/dba/postgres/PostgresSelectAction.java |   4 +-
 .../cayenne/dba/sqlserver/SQLServerAdapter.java    |   6 +-
 .../apache/cayenne/dba/sybase/SybaseAdapter.java   |   6 +-
 .../cayenne/log/CompactSlf4jJdbcEventLogger.java   |   4 +-
 .../apache/cayenne/log/Slf4jJdbcEventLogger.java   |   4 +-
 .../apache/cayenne/access/jdbc/RSColumnTest.java   |  20 +--
 .../select/ColumnDescriptorStageTest.java          |   2 +-
 .../DbAdapterDelegatedSelectTranslatorIT.java      |  18 +--
 .../select/DefaultObjectSelectTranslatorIT.java    |  32 ++---
 .../DefaultSQLTemplateTranslatorTest.java          |   2 +-
 .../log/CompactSlf4jJdbcEventLoggerTest.java       |   2 +-
 50 files changed, 266 insertions(+), 275 deletions(-)

diff --git 
a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/reader/CryptoRowReaderFactoryDecorator.java
 
b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/reader/CryptoRowReaderFactoryDecorator.java
index 590c3d77f..acfd558fe 100644
--- 
a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/reader/CryptoRowReaderFactoryDecorator.java
+++ 
b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/reader/CryptoRowReaderFactoryDecorator.java
@@ -97,7 +97,7 @@ public class CryptoRowReaderFactoryDecorator extends 
DefaultRowReaderFactory {
             RSColumn column = columns[i];
             DbAttribute attribute = column.attribute();
 
-            ExtendedType type = column.type();
+            ExtendedType type = column.reader();
 
             if (attribute != null && columnMapper.isEncrypted(attribute)) {
 
@@ -110,9 +110,9 @@ public class CryptoRowReaderFactoryDecorator extends 
DefaultRowReaderFactory {
                 // else - warning?
             }
 
-            encrypted[i] = type == column.type()
+            encrypted[i] = type == column.reader()
                     ? column
-                    : new RSColumn(column.name(), column.dataRowKey(), 
column.jdbcType(), type, attribute);
+                    : new RSColumn(column.rsName(), column.rsType(), 
column.dataRowName(), type, attribute);
         }
 
         return encrypted;
diff --git 
a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java
 
b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java
index c1df03b96..e6a750743 100644
--- 
a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java
+++ 
b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java
@@ -58,8 +58,8 @@ public class DefaultBindingsTransformer implements 
BindingsTransformer {
                     ? extendedTypeMap.getRegisteredType(transformed.getClass())
                     : extendedTypeMap.getDefaultType();
 
-            bindings[positions[i]] = new PSParameter(b.jdbcType(), b.scale(), 
b.attribute(),
-                    b.statementPosition(), transformed, extendedType);
+            bindings[positions[i]] = new PSParameter(transformed, 
b.psPosition(), b.psType(), b.psScale(), extendedType, b.attribute()
+            );
         }
     }
 
diff --git 
a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultTransformerFactory.java
 
b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultTransformerFactory.java
index 28a42f279..50d1cac5a 100644
--- 
a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultTransformerFactory.java
+++ 
b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultTransformerFactory.java
@@ -80,7 +80,7 @@ public class DefaultTransformerFactory implements 
TransformerFactory {
             for (int i = 0; i < dlen; i++) {
 
                 RSColumn cd = columns[cryptoColumns.get(i)];
-                mapKeys[i] = cd.dataRowKey();
+                mapKeys[i] = cd.dataRowName();
                 transformers[i] = transformerFactory.decryptor(cd.attribute());
             }
 
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DefaultValueForNullProvider.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DefaultValueForNullProvider.java
index 8bd364edc..23ff731ca 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DefaultValueForNullProvider.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DefaultValueForNullProvider.java
@@ -35,7 +35,7 @@ public class DefaultValueForNullProvider implements 
ValueForNullProvider {
     public void set(DbEntity entity, DbAttribute column, Object value, int 
type) {
         // the binding is only ever read for its value (inlined into the 
UPDATE below), never bound to a
         // statement, so the position is irrelevant here
-        PSParameter binding = new PSParameter(type, 
column.getAttributePrecision(), null, 1, value, null);
+        PSParameter binding = new PSParameter(value, 1, type, 
column.getAttributePrecision(), null, null);
         values.put(createKey(entity, column), binding);
     }
 
diff --git 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/ValueForNullIT.java
 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/ValueForNullIT.java
index b28c8e3d6..a5ebe78e0 100644
--- 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/ValueForNullIT.java
+++ 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/ValueForNullIT.java
@@ -105,7 +105,7 @@ public class ValueForNullIT extends MergeCase {
                 int type = column.getType();
                 switch (type) {
                     case Types.VARCHAR:
-                        return new PSParameter(type, -1, null, 1, 
DEFAULT_VALUE_STRING, null);
+                        return new PSParameter(DEFAULT_VALUE_STRING, 1, type, 
-1, null, null);
                     default:
                         throw new AssertionError("should not get here");
                 }
diff --git 
a/cayenne-velocity/src/main/java/org/apache/cayenne/velocity/BindDirective.java 
b/cayenne-velocity/src/main/java/org/apache/cayenne/velocity/BindDirective.java
index 19522e728..5f1c3ea78 100644
--- 
a/cayenne-velocity/src/main/java/org/apache/cayenne/velocity/BindDirective.java
+++ 
b/cayenne-velocity/src/main/java/org/apache/cayenne/velocity/BindDirective.java
@@ -172,8 +172,8 @@ public class BindDirective extends Directive {
                if (bindings != null) {
                        // a binding's statement position is its 1-based 
ordinal among the bound parameters; the
                        // ExtendedType is resolved from the value via the 
adapter
-                       bindings.add(new PSParameter(jdbcType, scale, null,
-                                       bindings.size() + 1, value, 
extendedType(context, value)));
+                       bindings.add(new PSParameter(value, bindings.size() + 
1, jdbcType, scale, extendedType(context, value), null
+                       ));
                }
        }
 
diff --git 
a/cayenne-velocity/src/main/java/org/apache/cayenne/velocity/ResultDirective.java
 
b/cayenne-velocity/src/main/java/org/apache/cayenne/velocity/ResultDirective.java
index e6e74a5d9..978d7f8ac 100644
--- 
a/cayenne-velocity/src/main/java/org/apache/cayenne/velocity/ResultDirective.java
+++ 
b/cayenne-velocity/src/main/java/org/apache/cayenne/velocity/ResultDirective.java
@@ -142,7 +142,7 @@ public class ResultDirective extends Directive {
                Object jdbcTypeChild = getChild(context, node, 4);
                int jdbcType = (jdbcTypeChild instanceof Number) ? ((Number) 
jdbcTypeChild).intValue() : 0;
 
-               RSColumn columnDescriptor = new RSColumn(column, label, 
jdbcType, extendedType, null);
+               RSColumn columnDescriptor = new RSColumn(column, jdbcType, 
label, extendedType, null);
 
                writer.write(column);
 
diff --git 
a/cayenne-velocity/src/test/java/org/apache/cayenne/velocity/VelocitySQLTemplateTranslatorTest.java
 
b/cayenne-velocity/src/test/java/org/apache/cayenne/velocity/VelocitySQLTemplateTranslatorTest.java
index cda53ff47..37c41afad 100644
--- 
a/cayenne-velocity/src/test/java/org/apache/cayenne/velocity/VelocitySQLTemplateTranslatorTest.java
+++ 
b/cayenne-velocity/src/test/java/org/apache/cayenne/velocity/VelocitySQLTemplateTranslatorTest.java
@@ -245,6 +245,6 @@ public class VelocitySQLTemplateTranslatorTest {
 
        private void assertBindingType(Integer expectedType, Object binding) {
                assertTrue(binding instanceof PSParameter, "Not a binding!");
-               assertEquals(expectedType, ((PSParameter) binding).jdbcType());
+               assertEquals(expectedType, ((PSParameter) binding).psType());
        }
 }
diff --git 
a/cayenne-velocity/src/test/java/org/apache/cayenne/velocity/VelocitySQLTemplateTranslator_SelectTest.java
 
b/cayenne-velocity/src/test/java/org/apache/cayenne/velocity/VelocitySQLTemplateTranslator_SelectTest.java
index 561615f4d..d12bc077b 100644
--- 
a/cayenne-velocity/src/test/java/org/apache/cayenne/velocity/VelocitySQLTemplateTranslator_SelectTest.java
+++ 
b/cayenne-velocity/src/test/java/org/apache/cayenne/velocity/VelocitySQLTemplateTranslator_SelectTest.java
@@ -67,8 +67,8 @@ public class VelocitySQLTemplateTranslator_SelectTest {
                assertEquals("SELECT A FROM ME", compiled.sql());
                assertEquals(0, compiled.bindings().length);
                assertEquals(1, compiled.resultColumns().length);
-               assertEquals("A", compiled.resultColumns()[0].name());
-               assertSame(adapter.getExtendedTypes().getDefaultType(), 
compiled.resultColumns()[0].type());
+               assertEquals("A", compiled.resultColumns()[0].rsName());
+               assertSame(adapter.getExtendedTypes().getDefaultType(), 
compiled.resultColumns()[0].reader());
        }
 
        @Test
@@ -81,8 +81,8 @@ public class VelocitySQLTemplateTranslator_SelectTest {
                assertEquals(0, compiled.bindings().length);
 
                assertEquals(1, compiled.resultColumns().length);
-               assertEquals("A", compiled.resultColumns()[0].name());
-               
assertSame(adapter.getExtendedTypes().getRegisteredType(String.class), 
compiled.resultColumns()[0].type());
+               assertEquals("A", compiled.resultColumns()[0].rsName());
+               
assertSame(adapter.getExtendedTypes().getRegisteredType(String.class), 
compiled.resultColumns()[0].reader());
        }
 
        @Test
@@ -96,9 +96,9 @@ public class VelocitySQLTemplateTranslator_SelectTest {
 
                assertEquals(1, compiled.resultColumns().length);
                RSColumn column = compiled.resultColumns()[0];
-               assertEquals("A", column.name());
-               assertEquals("B", column.dataRowKey());
-               
assertSame(adapter.getExtendedTypes().getRegisteredType(String.class), 
column.type());
+               assertEquals("A", column.rsName());
+               assertEquals("B", column.dataRowName());
+               
assertSame(adapter.getExtendedTypes().getRegisteredType(String.class), 
column.reader());
        }
 
        @Test
@@ -111,8 +111,8 @@ public class VelocitySQLTemplateTranslator_SelectTest {
                assertEquals(0, compiled.bindings().length);
 
                assertEquals(3, compiled.resultColumns().length);
-               assertEquals("A", compiled.resultColumns()[0].name());
-               assertEquals("B", compiled.resultColumns()[1].name());
-               assertEquals("C", compiled.resultColumns()[2].name());
+               assertEquals("A", compiled.resultColumns()[0].rsName());
+               assertEquals("B", compiled.resultColumns()[1].rsName());
+               assertEquals("C", compiled.resultColumns()[2].rsName());
        }
 }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java
index 13a803fe1..8334ed350 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java
@@ -106,8 +106,8 @@ class PrefetchProcessorJointNode extends 
PrefetchProcessorNode {
 
         Map<String, Object> id = new TreeMap<>();
         for (int idIndex : idIndices) {
-            Object value = flatRow.get(columns[idIndex].dataRowKey());
-            id.put(columns[idIndex].name(), value);
+            Object value = flatRow.get(columns[idIndex].dataRowName());
+            id.put(columns[idIndex].rsName(), value);
         }
 
         return id;
@@ -137,7 +137,7 @@ class PrefetchProcessorJointNode extends 
PrefetchProcessorNode {
 
         // extract subset of flat row columns, recasting to the target keys
         for (RSColumn column : columns) {
-            row.put(column.name(), flatRow.get(column.dataRowKey()));
+            row.put(column.rsName(), flatRow.get(column.dataRowName()));
         }
 
         // since JDBC row reader won't inject JOINED entity name, we have to 
detect it here...
@@ -247,7 +247,7 @@ class PrefetchProcessorJointNode extends 
PrefetchProcessorNode {
         RSColumn column = map.get(name);
 
         if (column == null) {
-            column = new RSColumn(name, label, 0, null, null);
+            column = new RSColumn(name, 0, label, null, null);
             map.put(name, column);
         }
 
@@ -273,7 +273,7 @@ class PrefetchProcessorJointNode extends 
PrefetchProcessorNode {
             DbAttribute pk = it.next();
 
             for (int j = 0; j < columns.length; j++) {
-                if (pk.getName().equals(columns[j].name())) {
+                if (pk.getName().equals(columns[j].rsName())) {
                     idIndices[i] = j;
                     break;
                 }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java
index 6a6e448b4..eb32da59a 100644
--- a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java
+++ b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java
@@ -285,7 +285,7 @@ public class BatchAction extends BaseSQLAction {
                                        }
                                }
                                ExtendedType type = 
dataNode.getAdapter().getExtendedTypes().getRegisteredType(typeForGeneratedPK(key));
-                               rowBuilder.columns(new RSColumn(columnName, 
columnName, key.getType(), type, null));
+                               rowBuilder.columns(new RSColumn(columnName, 
key.getType(), columnName, type, null));
                        } else {
                                rowBuilder.resultSet(keysRS);
                        }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/PSBatchParameter.java 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/PSBatchParameter.java
index 11c239b76..eff4e8b43 100644
--- a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/PSBatchParameter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/PSBatchParameter.java
@@ -24,16 +24,16 @@ import org.apache.cayenne.map.DbAttribute;
 
 /**
  * An immutable per-batch parameter binding template, carrying only the static 
column metadata shared by all
- * rows of a batch. A per-row {@link PSParameter} is produced by {@link 
#bind(int, Object, ExtendedType)}.
+ * rows of a batch. A per-row {@link PSParameter} is produced by {@link 
#bind(Object, int, ExtendedType)}.
  *
  * @since 5.0
  */
-public record PSBatchParameter(int jdbcType, int scale, DbAttribute attribute) 
{
+public record PSBatchParameter(int psType, int psScale, DbAttribute attribute) 
{
 
     /**
      * Resolves this per-batch template into a per-row {@link PSParameter}.
      */
-    public <T> PSParameter<T> bind(int statementPosition, T value, 
ExtendedType<T> extendedType) {
-        return new PSParameter<>(jdbcType, scale, attribute, 
statementPosition, value, extendedType);
+    public <T> PSParameter<T> bind(T value, int psPosition, ExtendedType<T> 
extendedType) {
+        return new PSParameter<>(value, psPosition, psType, psScale, 
extendedType, attribute);
     }
 }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/PSParameter.java 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/PSParameter.java
index 7b041b164..d66c3b0e3 100644
--- a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/PSParameter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/PSParameter.java
@@ -27,10 +27,11 @@ import org.apache.cayenne.map.DbAttribute;
  * @since 5.0
  */
 public record PSParameter<T>(
-        int jdbcType,
-        int scale,
-        DbAttribute attribute,
-        int statementPosition,
         T value,
-        ExtendedType<T> extendedType) {
+        int psPosition,
+        int psType,
+        int psScale,
+        ExtendedType<T> binder,
+        DbAttribute attribute
+) {
 }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java
index cb16f3dbc..1db6de0fe 100644
--- a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java
+++ b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java
@@ -199,7 +199,7 @@ public class ProcedureAction extends BaseSQLAction {
                for (int i = 0; i < columns.length; i++) {
                        ProcedureColumn c = columns[i];
                        ExtendedType type = 
typeMap.getRegisteredType(c.javaClass());
-                       result[i] = new RSColumn(c.name(), c.dataRowKey(), 
c.jdbcType(), type, null);
+                       result[i] = new RSColumn(c.name(), c.jdbcType(), 
c.dataRowKey(), type, null);
                }
                return result;
        }
diff --git a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/RSColumn.java 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/RSColumn.java
index 62beee056..6b2acf134 100644
--- a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/RSColumn.java
+++ b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/RSColumn.java
@@ -45,15 +45,15 @@ import java.util.function.Function;
  * @since 5.0
  */
 public record RSColumn(
-        String name,
-        String dataRowKey,
-        int jdbcType,
-        ExtendedType<?> type,
+        String rsName,
+        int rsType,
+        String dataRowName,
+        ExtendedType<?> reader,
         DbAttribute attribute) {
 
     public RSColumn {
-        if (dataRowKey == null) {
-            dataRowKey = name;
+        if (dataRowName == null) {
+            dataRowName = rsName;
         }
     }
 
@@ -67,8 +67,8 @@ public record RSColumn(
             return false;
         }
 
-        return Objects.equals(name, rhs.name)
-                && Objects.equals(dataRowKey, rhs.dataRowKey);
+        return Objects.equals(rsName, rhs.rsName)
+                && Objects.equals(dataRowName, rhs.dataRowName);
     }
 
     /**
@@ -76,7 +76,7 @@ public record RSColumn(
      */
     @Override
     public int hashCode() {
-        return Objects.hash(name, dataRowKey);
+        return Objects.hash(rsName, dataRowName);
     }
 
     /**
@@ -169,8 +169,8 @@ public record RSColumn(
 
                 // validate uniqueness of names
                 if (validateDuplicateColumnNames) {
-                    if (!uniqueNames.add(column.dataRowKey())) {
-                        duplicates.add(column.dataRowKey());
+                    if (!uniqueNames.add(column.dataRowName())) {
+                        duplicates.add(column.dataRowName());
                     }
                 }
                 rsColumns[outputLen] = column;
@@ -203,9 +203,9 @@ public record RSColumn(
             for (int i = 0; i < len; i++) {
                 if (columnArray[i] != null) {
                     if (mergeColumnsWithRsMetadata) {
-                        return new RSColumn(rowKey, rowKey, 
resultSetMetadata.getColumnType(position), columnArray[position - 1].type(), 
null);
+                        return new RSColumn(rowKey, 
resultSetMetadata.getColumnType(position), rowKey, columnArray[position - 
1].reader(), null);
                     } else {
-                        String columnRowKey = columnArray[i].dataRowKey();
+                        String columnRowKey = columnArray[i].dataRowName();
 
                         // TODO: andrus, 10/14/2009 - 'equalsIgnoreCase' check 
can result in
                         // subtle bugs in DBs with case-sensitive column names 
(or when quotes are
@@ -220,7 +220,7 @@ public record RSColumn(
             // columnArray doesn't contain ColumnDescriptor for specified 
column
             int jdbcType = resultSetMetadata.getColumnType(position);
             ExtendedType<?> type = 
typeMap.getRegisteredType(TypesMapping.getJavaBySqlType(jdbcType));
-            return new RSColumn(rowKey, rowKey, jdbcType, type, null);
+            return new RSColumn(rowKey, jdbcType, rowKey, type, null);
         }
 
         // Return a non-empty string with ColumnLabel or ColumnName or 
"column_<pos>" for positional column
@@ -245,9 +245,9 @@ public record RSColumn(
             for (int i = 0; i < columnArray.length; i++) {
                 RSColumn column = columnArray[i];
 
-                String name = column.name();
-                String dataRowKey = column.dataRowKey();
-                ExtendedType<?> type = column.type();
+                String name = column.rsName();
+                String dataRowKey = column.dataRowName();
+                ExtendedType<?> type = column.reader();
 
                 if (caseTransformer != null) {
                     name = caseTransformer.apply(name);
@@ -262,7 +262,7 @@ public record RSColumn(
                     }
                 }
 
-                result[i] = new RSColumn(name, dataRowKey, column.jdbcType(), 
type, column.attribute());
+                result[i] = new RSColumn(name, column.rsType(), dataRowKey, 
type, column.attribute());
             }
             return result;
         }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
index 8cf37be5e..b9d5de054 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
@@ -309,7 +309,7 @@ public class SQLTemplateAction implements SQLAction {
         for (int i = 0; i < size; i++) {
             // only the Java class is known here; name and jdbcType are 
resolved later from ResultSet metadata
             ExtendedType type = 
extendedTypes.getRegisteredType(query.getResultColumnsTypes().get(i));
-            columns[i] = new RSColumn(null, null, 0, type, null);
+            columns[i] = new RSColumn(null, 0, null, type, null);
         }
         return columns;
     }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java
index ac919b5d9..823bd6aa6 100644
--- a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java
+++ b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java
@@ -79,7 +79,7 @@ public class SelectAction extends BaseSQLAction {
             // and therefore only supports standard java types now) hence, a
             // special moronic case here:
             if (b.attribute() == null) {
-                statement.setObject(b.statementPosition(), b.value());
+                statement.setObject(b.psPosition(), b.value());
             } else {
                 adapter.bindParameter(statement, b);
             }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/BaseRowReader.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/BaseRowReader.java
index 0a6dc3e22..a6cefeab1 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/BaseRowReader.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/BaseRowReader.java
@@ -18,13 +18,13 @@
  ****************************************************************/
 package org.apache.cayenne.access.jdbc.reader;
 
-import java.sql.ResultSet;
-
 import org.apache.cayenne.access.jdbc.RSColumn;
 import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.query.QueryMetadata;
 
+import java.sql.ResultSet;
+
 /**
  * @since 3.0
  */
@@ -47,9 +47,9 @@ abstract class BaseRowReader<T> implements RowReader<T> {
         this.types = new int[width];
 
         for (int i = 0; i < width; i++) {
-            converters[i] = columns[i].type();
-            labels[i] = columns[i].dataRowKey();
-            types[i] = columns[i].jdbcType();
+            converters[i] = columns[i].reader();
+            labels[i] = columns[i].dataRowName();
+            types[i] = columns[i].rsType();
         }
     }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/DefaultRowReaderFactory.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/DefaultRowReaderFactory.java
index 1976a65dc..84fdda10d 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/DefaultRowReaderFactory.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/DefaultRowReaderFactory.java
@@ -18,94 +18,102 @@
  ****************************************************************/
 package org.apache.cayenne.access.jdbc.reader;
 
-import java.util.List;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.jdbc.RSColumn;
+import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.query.EmbeddableResultSegment;
 import org.apache.cayenne.query.EntityResultSegment;
 import org.apache.cayenne.query.QueryMetadata;
 import org.apache.cayenne.query.ScalarResultSegment;
 
+import java.util.List;
+
 /**
  * @since 4.0
  */
 public class DefaultRowReaderFactory implements RowReaderFactory {
 
-       @Override
-       public RowReader<?> rowReader(RSColumn[] columns, QueryMetadata 
queryMetadata, DbAdapter adapter) {
-
-               List<Object> rsMapping = queryMetadata.getResultSetMapping();
-               if (rsMapping == null) {
-                       return createFullRowReader(columns, queryMetadata);
-               }
-
-               int resultWidth = rsMapping.size();
-               if (resultWidth == 0) {
-                       throw new CayenneRuntimeException("Empty result 
columns");
-               }
-
-               if (queryMetadata.isSingleResultSetMapping()) {
-
-                       Object segment = rsMapping.get(0);
-
-                       if (segment instanceof EntityResultSegment) {
-                               return createEntityRowReader(columns, 
queryMetadata, (EntityResultSegment) segment);
-                       } else if (segment instanceof EmbeddableResultSegment) {
-                               return createEmbeddableRowReader(columns, 
queryMetadata, (EmbeddableResultSegment) segment);
-                       } else {
-                               return createScalarRowReader(columns, 
queryMetadata, (ScalarResultSegment) segment);
-                       }
-               } else {
-                       CompoundRowReader reader = new 
CompoundRowReader(resultWidth);
-
-                       for (int i = 0; i < resultWidth; i++) {
-                               Object segment = rsMapping.get(i);
-
-                               if (segment instanceof EntityResultSegment) {
-                                       reader.addRowReader(i,
-                                                       
createEntityRowReader(columns, queryMetadata, (EntityResultSegment) segment));
-                               } else if(segment instanceof 
EmbeddableResultSegment) {
-                                       reader.addRowReader(i, 
createEmbeddableRowReader(columns, queryMetadata, (EmbeddableResultSegment) 
segment));
-                               } else {
-                                       reader.addRowReader(i, 
createScalarRowReader(columns, queryMetadata, (ScalarResultSegment) segment));
-                               }
-                       }
-
-                       return reader;
-               }
-       }
-
-       private RowReader<?> createEmbeddableRowReader(RSColumn[] columns, 
QueryMetadata queryMetadata, EmbeddableResultSegment segment) {
-               return new EmbeddableRowReader(columns, queryMetadata, segment);
-       }
-
-       protected RowReader<?> createScalarRowReader(RSColumn[] columns, 
QueryMetadata queryMetadata, ScalarResultSegment segment) {
-               return new ScalarRowReader<>(columns, segment);
-       }
-
-       protected RowReader<?> createEntityRowReader(RSColumn[] columns, 
QueryMetadata queryMetadata,
+    @Override
+    public RowReader<?> rowReader(RSColumn[] columns, QueryMetadata 
queryMetadata, DbAdapter adapter) {
+
+        List<Object> rsMapping = queryMetadata.getResultSetMapping();
+        if (rsMapping == null) {
+            return createFullRowReader(columns, queryMetadata);
+        }
+
+        int resultWidth = rsMapping.size();
+        if (resultWidth == 0) {
+            throw new CayenneRuntimeException("Empty result columns");
+        }
+
+        if (queryMetadata.isSingleResultSetMapping()) {
+            return segmentRowReader(rsMapping.getFirst(), columns, 
queryMetadata);
+        } else {
+            CompoundRowReader reader = new CompoundRowReader(resultWidth);
+            for (int i = 0; i < resultWidth; i++) {
+                reader.addRowReader(i, segmentRowReader(rsMapping.get(i), 
columns, queryMetadata));
+            }
+
+            return reader;
+        }
+    }
+
+    private RowReader<?> segmentRowReader(Object segment, RSColumn[] columns, 
QueryMetadata queryMetadata) {
+        return switch (segment) {
+            case EntityResultSegment ers -> createEntityRowReader(columns, 
queryMetadata, ers);
+            case EmbeddableResultSegment ers -> 
createEmbeddableRowReader(columns, ers);
+            case ScalarResultSegment srs -> createScalarRowReader(columns, 
queryMetadata, srs);
+            case null, default -> throw new IllegalStateException("Unknown 
segment type: " + segment);
+        };
+    }
+
+    private RowReader<?> createEmbeddableRowReader(RSColumn[] columns, 
EmbeddableResultSegment segment) {
+        int segmentWidth = segment.getFields().size();
+        int startIndex = segment.getColumnOffset();
+        ExtendedType<?>[] converters = new ExtendedType[segmentWidth];
+        int[] types = new int[segmentWidth];
+        String[] labels = new String[segmentWidth];
+
+        for (int i = 0; i < segmentWidth; i++) {
+            converters[i] = columns[startIndex + i].reader();
+            types[i] = columns[startIndex + i].rsType();
+            labels[i] = segment.getFields().get(columns[startIndex + 
i].rsName());
+        }
+
+        return new EmbeddableRowReader(converters, types, labels, startIndex);
+    }
+
+    protected RowReader<?> createScalarRowReader(RSColumn[] columns, 
QueryMetadata queryMetadata, ScalarResultSegment segment) {
+        int scalarIndex = segment.getColumnOffset();
+        return new ScalarRowReader<>(
+                columns[scalarIndex].reader(),
+                // jdbc column indexes start from 1
+                scalarIndex + 1,
+                columns[scalarIndex].rsType());
+    }
+
+    protected RowReader<?> createEntityRowReader(RSColumn[] columns, 
QueryMetadata queryMetadata,
                                                  EntityResultSegment 
resultMetadata) {
 
-               if (queryMetadata.getPageSize() > 0) {
-                       return new IdRowReader<>(columns, queryMetadata, 
resultMetadata);
-               } else if (resultMetadata.getClassDescriptor() != null && 
resultMetadata.getClassDescriptor().hasSubclasses()) {
-                       return new InheritanceAwareEntityRowReader(columns, 
resultMetadata);
-               } else {
-                       return new EntityRowReader(columns, resultMetadata);
-               }
-       }
-
-       protected RowReader<?> createFullRowReader(RSColumn[] columns, 
QueryMetadata queryMetadata) {
-
-               if (queryMetadata.getPageSize() > 0) {
-                       return new IdRowReader<>(columns, queryMetadata, null);
-               } else if (queryMetadata.getClassDescriptor() != null && 
queryMetadata.getClassDescriptor().hasSubclasses()) {
-                       return new InheritanceAwareRowReader(columns, 
queryMetadata);
-               } else {
-                       return new FullRowReader(columns, queryMetadata);
-               }
-       }
+        if (queryMetadata.getPageSize() > 0) {
+            return new IdRowReader<>(columns, queryMetadata, resultMetadata);
+        } else if (resultMetadata.getClassDescriptor() != null && 
resultMetadata.getClassDescriptor().hasSubclasses()) {
+            return new InheritanceAwareEntityRowReader(columns, 
resultMetadata);
+        } else {
+            return new EntityRowReader(columns, resultMetadata);
+        }
+    }
+
+    protected RowReader<?> createFullRowReader(RSColumn[] columns, 
QueryMetadata queryMetadata) {
+
+        if (queryMetadata.getPageSize() > 0) {
+            return new IdRowReader<>(columns, queryMetadata, null);
+        } else if (queryMetadata.getClassDescriptor() != null && 
queryMetadata.getClassDescriptor().hasSubclasses()) {
+            return new InheritanceAwareRowReader(columns, queryMetadata);
+        } else {
+            return new FullRowReader(columns, queryMetadata);
+        }
+    }
 
 }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/EmbeddableRowReader.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/EmbeddableRowReader.java
index 4691f3530..c172c3528 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/EmbeddableRowReader.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/EmbeddableRowReader.java
@@ -19,15 +19,11 @@
 
 package org.apache.cayenne.access.jdbc.reader;
 
-import java.sql.ResultSet;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.DataRow;
-import org.apache.cayenne.access.jdbc.RSColumn;
 import org.apache.cayenne.access.types.ExtendedType;
-import org.apache.cayenne.query.EmbeddableResultSegment;
-import org.apache.cayenne.query.QueryMetadata;
-import org.apache.cayenne.util.Util;
+
+import java.sql.ResultSet;
 
 /**
  * @since 4.2
@@ -36,23 +32,16 @@ class EmbeddableRowReader implements RowReader<DataRow> {
 
     private final int startIndex;
     private final int mapCapacity;
-    private final ExtendedType[] converters;
+    private final ExtendedType<?>[] converters;
     private final String[] labels;
     private final int[] types;
 
-    EmbeddableRowReader(RSColumn[] columns, QueryMetadata queryMetadata, 
EmbeddableResultSegment segment) {
-        int segmentWidth = segment.getFields().size();
-        this.startIndex = segment.getColumnOffset();
-        this.converters = new ExtendedType[segmentWidth];
-        this.types = new int[segmentWidth];
-        this.labels = new String[segmentWidth];
-
-        for (int i = 0; i < segmentWidth; i++) {
-            this.converters[i] = columns[startIndex + i].type();
-            types[i] = columns[startIndex + i].jdbcType();
-            labels[i] = segment.getFields().get(columns[startIndex +i].name());
-        }
-        this.mapCapacity = (int) Math.ceil(segmentWidth / 0.75);
+    EmbeddableRowReader(ExtendedType<?>[] converters, int[] types, String[] 
labels, int startIndex) {
+        this.converters = converters;
+        this.types = types;
+        this.labels = labels;
+        this.startIndex = startIndex;
+        this.mapCapacity = (int) Math.ceil(converters.length / 0.75);
     }
 
     @Override
@@ -66,11 +55,10 @@ class EmbeddableRowReader implements RowReader<DataRow> {
                 row.put(labels[i], val);
             }
             return row;
-        } catch (CayenneRuntimeException cex) {
-            // rethrow unmodified
-            throw cex;
-        } catch (Exception otherex) {
-            throw new CayenneRuntimeException("Exception materializing 
column.", Util.unwindException(otherex));
+        } catch (CayenneRuntimeException ex) {
+            throw ex;
+        } catch (Exception ex) {
+            throw new CayenneRuntimeException("Exception materializing 
column.", ex);
         }
     }
 }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/EntityRowReader.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/EntityRowReader.java
index e97141ffe..524066fa1 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/EntityRowReader.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/EntityRowReader.java
@@ -56,18 +56,18 @@ class EntityRowReader implements RowReader<DataRow> {
         this.labels = new String[segmentWidth];
 
         for (int i = 0; i < segmentWidth; i++) {
-            this.converters[i] = columns[startIndex + i].type();
-            types[i] = columns[startIndex + i].jdbcType();
+            this.converters[i] = columns[startIndex + i].reader();
+            types[i] = columns[startIndex + i].rsType();
 
             // query translator may change the order of fields compare to the 
entity
             // result, so figure out DataRow labels by doing reverse lookup of
             // RowDescriptor labels...
-            if (columns[startIndex + i].dataRowKey().contains(".")) {
+            if (columns[startIndex + i].dataRowName().contains(".")) {
                 // if the dataRowKey contains ".", it is prefetched column and
                 // we can use it instead of search the name by alias
-                labels[i] = columns[startIndex + i].dataRowKey();
+                labels[i] = columns[startIndex + i].dataRowName();
             } else {
-                labels[i] = segmentMetadata.getColumnPath(columns[startIndex + 
i].dataRowKey());
+                labels[i] = segmentMetadata.getColumnPath(columns[startIndex + 
i].dataRowName());
             }
         }
         this.mapCapacity = (int) Math.ceil(segmentWidth / 0.75);
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/FullRowReader.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/FullRowReader.java
index 9e95a1ac5..31857d6cd 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/FullRowReader.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/FullRowReader.java
@@ -18,13 +18,12 @@
  ****************************************************************/
 package org.apache.cayenne.access.jdbc.reader;
 
-import java.sql.ResultSet;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.access.jdbc.RSColumn;
 import org.apache.cayenne.query.QueryMetadata;
-import org.apache.cayenne.util.Util;
+
+import java.sql.ResultSet;
 
 /**
  * @since 3.0
@@ -56,11 +55,10 @@ class FullRowReader extends BaseRowReader<DataRow> {
             postprocessRow(resultSet, dataRow);
 
             return dataRow;
-        } catch (CayenneRuntimeException cex) {
-            // rethrow unmodified
-            throw cex;
-        } catch (Exception otherex) {
-            throw new CayenneRuntimeException("Exception materializing 
column.", Util.unwindException(otherex));
+        } catch (CayenneRuntimeException ex) {
+            throw ex;
+        } catch (Exception ex) {
+            throw new CayenneRuntimeException("Exception materializing 
column.", ex);
         }
     }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/IdRowReader.java 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/IdRowReader.java
index b7aaea30e..789ccf2d8 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/IdRowReader.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/IdRowReader.java
@@ -18,8 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.access.jdbc.reader;
 
-import java.sql.ResultSet;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.access.jdbc.RSColumn;
@@ -29,6 +27,8 @@ import org.apache.cayenne.query.EntityResultSegment;
 import org.apache.cayenne.query.QueryMetadata;
 import org.apache.cayenne.util.Util;
 
+import java.sql.ResultSet;
+
 /**
  * @since 3.0
  */
@@ -58,7 +58,7 @@ class IdRowReader<T> extends BaseRowReader<T> {
                 resultMetadata.getColumnOffset() :
                 0;
         for(int i = offset, j = 0; i < offset + len; i++) {
-            DbAttribute a = dbEntity.getAttribute(columns[i].name());
+            DbAttribute a = dbEntity.getAttribute(columns[i].rsName());
             if(a != null && a.isPrimaryKey()) {
                 pk[j++] = i;
             }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/ScalarRowReader.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/ScalarRowReader.java
index 4c4ff75c5..14e86dd6b 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/ScalarRowReader.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/reader/ScalarRowReader.java
@@ -18,35 +18,31 @@
  ****************************************************************/
 package org.apache.cayenne.access.jdbc.reader;
 
-import java.sql.ResultSet;
-
 import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.access.jdbc.RSColumn;
 import org.apache.cayenne.access.types.ExtendedType;
-import org.apache.cayenne.query.ScalarResultSegment;
 import org.apache.cayenne.util.Util;
 
+import java.sql.ResultSet;
+
 /**
  * @since 3.0
  */
 class ScalarRowReader<T> implements RowReader<T> {
 
-    private final ExtendedType<T> converter;
+    private final ExtendedType<T> reader;
     private final int index;
     private final int type;
 
-    @SuppressWarnings("unchecked")
-    ScalarRowReader(RSColumn[] columns, ScalarResultSegment segmentMetadata) {
-        int scalarIndex = segmentMetadata.getColumnOffset();
-        this.converter = (ExtendedType<T>) columns[scalarIndex].type();
-        this.type = columns[scalarIndex].jdbcType();
-        this.index = scalarIndex + 1;
+    public ScalarRowReader(ExtendedType<T> reader, int index, int type) {
+        this.reader = reader;
+        this.index = index;
+        this.type = type;
     }
 
     @Override
     public T readRow(ResultSet resultSet) {
         try {
-            return converter.materializeObject(resultSet, index, type);
+            return reader.materializeObject(resultSet, index, type);
         } catch (CayenneRuntimeException cex) {
             // rethrow unmodified
             throw cex;
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ValueNode.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ValueNode.java
index ab5263ed7..3aea5cdff 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ValueNode.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ValueNode.java
@@ -135,10 +135,10 @@ public class ValueNode extends Node {
         // literals not bound to a column); fall back to deriving the JDBC 
type from the value
         int statementPosition = context.getBindings().size() + 1;
         PSParameter binding = (attribute != null)
-                ? new 
PSParameter(context.getAdapter().preferredBindingType(attribute.getType()),
-                        attribute.getScale(), attribute, statementPosition, 
value, extendedType)
-                : new 
PSParameter(context.getAdapter().preferredBindingType(TypesMapping.getSqlTypeByJava(value.getClass())),
-                        -1, null, statementPosition, value, extendedType);
+                ? new PSParameter(value, statementPosition, 
context.getAdapter().preferredBindingType(attribute.getType()),
+                        attribute.getScale(), extendedType, attribute)
+                : new PSParameter(value, statementPosition, 
context.getAdapter().preferredBindingType(TypesMapping.getSqlTypeByJava(value.getClass())),
+                        -1, extendedType, null);
 
         context.getBindings().add(binding);
     }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/BaseBatchTranslator.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/BaseBatchTranslator.java
index 0c7b177ba..deeeadc2c 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/BaseBatchTranslator.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/BaseBatchTranslator.java
@@ -54,7 +54,7 @@ public abstract class BaseBatchTranslator<T extends 
BatchQuery> implements Batch
 
     protected PSBatchParameter[] createBindings(BatchTranslatorContext<T> 
context) {
         return context.getBindings().stream()
-                .map(b -> new PSBatchParameter(b.jdbcType(), b.scale(), 
b.attribute()))
+                .map(b -> new PSBatchParameter(b.psType(), b.psScale(), 
b.attribute()))
                 .toArray(PSBatchParameter[]::new);
     }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/DeleteBatchTranslator.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/DeleteBatchTranslator.java
index 092095fe8..69d99efb6 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/DeleteBatchTranslator.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/DeleteBatchTranslator.java
@@ -69,7 +69,7 @@ public class DeleteBatchTranslator extends 
BaseBatchTranslator<DeleteBatchQuery>
         // skip null attributes... they are translated as "IS NULL"
         if (value != null) {
             ExtendedType extendedType = 
context.getAdapter().getExtendedTypes().getRegisteredType(value.getClass());
-            bindings[position] = template[position].bind(++position, value, 
extendedType);
+            bindings[position] = template[position].bind(value, ++position, 
extendedType);
         }
         return position;
     }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslator.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslator.java
index 477de4d0b..9e7bd2e6c 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslator.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslator.java
@@ -70,7 +70,7 @@ public class InsertBatchTranslator extends 
BaseBatchTranslator<InsertBatchQuery>
             ExtendedType extendedType = value != null
                     ? 
context.getAdapter().getExtendedTypes().getRegisteredType(value.getClass())
                     : context.getAdapter().getExtendedTypes().getDefaultType();
-            bindings[j] = template[j].bind(++j, value, extendedType);
+            bindings[j] = template[j].bind(value, ++j, extendedType);
         }
         return bindings;
     }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/SoftDeleteBatchTranslator.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/SoftDeleteBatchTranslator.java
index f2b4ea4eb..d08a39a6e 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/SoftDeleteBatchTranslator.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/SoftDeleteBatchTranslator.java
@@ -90,7 +90,7 @@ public class SoftDeleteBatchTranslator extends 
DeleteBatchTranslator {
         DbAttribute deleteAttribute = 
deleteBatch.getDbEntity().getAttribute(deletedFieldName);
         String typeName = TypesMapping.getJavaBySqlType(deleteAttribute);
         ExtendedType extendedType = 
context.getAdapter().getExtendedTypes().getRegisteredType(typeName);
-        bindings[0] = template[0].bind(1, Boolean.TRUE, extendedType);
+        bindings[0] = template[0].bind(Boolean.TRUE, 1, extendedType);
 
         // bindings[0] holds the constant 'deleted' flag, so qualifier values 
start at position 1
         for(int i=0, position=1; i<deleteBatch.getDbAttributes().size(); i++) {
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/UpdateBatchTranslator.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/UpdateBatchTranslator.java
index 5589158c6..d3e8c39d7 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/UpdateBatchTranslator.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/UpdateBatchTranslator.java
@@ -67,7 +67,7 @@ public class UpdateBatchTranslator extends 
BaseBatchTranslator<UpdateBatchQuery>
             ExtendedType extendedType = value == null
                 ? context.getAdapter().getExtendedTypes().getDefaultType()
                 : 
context.getAdapter().getExtendedTypes().getRegisteredType(value.getClass());
-            bindings[j] = template[j].bind(++j, value, extendedType);
+            bindings[j] = template[j].bind(value, ++j, extendedType);
         }
 
         for(DbAttribute attribute : updateBatch.getQualifierAttributes()) {
@@ -77,7 +77,7 @@ public class UpdateBatchTranslator extends 
BaseBatchTranslator<UpdateBatchQuery>
             }
             Object value = row.getValue(i);
             ExtendedType extendedType = 
context.getAdapter().getExtendedTypes().getRegisteredType(value.getClass());
-            bindings[j] = template[j].bind(++j, value, extendedType);
+            bindings[j] = template[j].bind(value, ++j, extendedType);
             i++;
         }
         return bindings;
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/procedure/DefaultProcedureTranslator.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/procedure/DefaultProcedureTranslator.java
index 39556e370..c62c36929 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/procedure/DefaultProcedureTranslator.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/procedure/DefaultProcedureTranslator.java
@@ -19,8 +19,6 @@
 
 package org.apache.cayenne.access.translator.procedure;
 
-import java.util.Map;
-
 import org.apache.cayenne.access.jdbc.PSParameter;
 import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.dba.DbAdapter;
@@ -29,6 +27,8 @@ import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.query.ProcedureQuery;
 
+import java.util.Map;
+
 /**
  * A {@link ProcedureTranslator} returned by the base {@link 
org.apache.cayenne.dba.JdbcAdapter}. Adapters may subclass
  * it to customize the generated call string.
@@ -76,12 +76,12 @@ public class DefaultProcedureTranslator implements 
ProcedureTranslator {
      * Builds a {@link PSParameter} for a single call parameter. IN (and 
INOUT) parameters carry the actual value
      * and its {@link ExtendedType}; pure OUT parameters carry an "[OUT]" 
marker value so that logging renders nicely.
      */
-    protected PSParameter createBinding(DbAdapter adapter, ProcedureParameter 
param,
+    protected PSParameter<?> createBinding(DbAdapter adapter, 
ProcedureParameter param,
                                         Map<String, ?> queryValues, int 
position) {
 
         // match values with parameters in the correct order, assuming a 
missing value is NULL
         if (param.getDirection() == ProcedureParameter.OUT_PARAMETER) {
-            return new PSParameter(param.getType(), param.getPrecision(), 
null, position, OUT_PARAM, null);
+            return new PSParameter<>(OUT_PARAM, position, param.getType(), 
param.getPrecision(), null, null);
         }
 
         Object value = queryValues.get(param.getName());
@@ -89,8 +89,8 @@ public class DefaultProcedureTranslator implements 
ProcedureTranslator {
                 ? 
adapter.getExtendedTypes().getRegisteredType(value.getClass())
                 : adapter.getExtendedTypes().getDefaultType();
 
-        return new PSParameter(adapter.preferredBindingType(param.getType()), 
param.getPrecision(), null,
-                position, value, extendedType);
+        return new PSParameter<>(
+                value, position, 
adapter.preferredBindingType(param.getType()), param.getPrecision(), 
extendedType, null);
     }
 
     /**
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/ColumnDescriptorStage.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/ColumnDescriptorStage.java
index a5bc53aa7..692bb0554 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/ColumnDescriptorStage.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/ColumnDescriptorStage.java
@@ -49,7 +49,7 @@ class ColumnDescriptorStage implements TranslationStage {
 
             ExtendedType type = 
context.getAdapter().getExtendedTypes().getRegisteredType(resultNode.getJavaType());
             RSColumn descriptor = new RSColumn(
-                    name, resultNode.getDataRowKey(), 
resultNode.getJdbcType(), type, attribute);
+                    name, resultNode.getJdbcType(), 
resultNode.getDataRowKey(), type, attribute);
 
             context.getColumnDescriptors().add(descriptor);
         }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/sqltemplate/Context.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/sqltemplate/Context.java
index 69dd5bf91..e041174a1 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/sqltemplate/Context.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/sqltemplate/Context.java
@@ -128,8 +128,8 @@ public class Context {
         }
         // a binding's statement position is its 1-based ordinal among the 
bound parameters; the
         // ExtendedType is resolved from the value via the adapter
-        parameterBindings.add(new PSParameter(jdbcType, scale, null,
-                parameterBindings.size() + 1, value, extendedType(value)));
+        parameterBindings.add(new PSParameter(value, parameterBindings.size() 
+ 1, jdbcType, scale, extendedType(value), null
+        ));
     }
 
     private ExtendedType<?> extendedType(Object value) {
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/sqltemplate/directive/Result.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/sqltemplate/directive/Result.java
index 33b4d2b7a..13b47ca4c 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/sqltemplate/directive/Result.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/sqltemplate/directive/Result.java
@@ -100,7 +100,7 @@ public class Result implements Directive {
             jdbcType = (int) expressions[4].evaluateAsLong(context);
         }
 
-        context.addColumnDescriptor(new RSColumn(column, label, jdbcType, 
context.getExtendedType(javaClass), null));
+        context.addColumnDescriptor(new RSColumn(column, jdbcType, label, 
context.getExtendedType(javaClass), null));
 
         context.getBuilder().append(column);
         if (!Util.isEmptyString(alias) && !alias.equals(column)) {
diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
index e68dba5de..f62bfb7f9 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
@@ -625,14 +625,14 @@ public class JdbcAdapter implements DbAdapter {
     public void bindParameter(PreparedStatement statement, PSParameter<?> 
parameter) throws Exception {
 
         if (parameter.value() == null) {
-            statement.setNull(parameter.statementPosition(), 
parameter.jdbcType());
+            statement.setNull(parameter.psPosition(), parameter.psType());
         } else {
-            ExtendedType t = parameter.extendedType();
+            ExtendedType t = parameter.binder();
             t.setJdbcObject(statement,
                     parameter.value(),
-                    parameter.statementPosition(),
-                    parameter.jdbcType(),
-                    parameter.scale());
+                    parameter.psPosition(),
+                    parameter.psType(),
+                    parameter.psScale());
         }
     }
 
diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
index 9e9adf868..99ca2b389 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
@@ -191,8 +191,8 @@ public class DB2Adapter extends JdbcAdapter {
 
     @Override
     public void bindParameter(PreparedStatement statement, PSParameter<?> 
parameter) throws Exception {
-        if (parameter.value() == null && (parameter.jdbcType() == 0 || 
parameter.jdbcType() == Types.BOOLEAN)) {
-            statement.setNull(parameter.statementPosition(), Types.VARCHAR);
+        if (parameter.value() == null && (parameter.psType() == 0 || 
parameter.psType() == Types.BOOLEAN)) {
+            statement.setNull(parameter.psPosition(), Types.VARCHAR);
         } else {
             super.bindParameter(statement, parameter);
         }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java
index 5ab308bd1..e5b55e1b1 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java
@@ -216,8 +216,8 @@ public class DerbyAdapter extends JdbcAdapter {
     @Override
     public void bindParameter(PreparedStatement statement, PSParameter<?> 
parameter) throws Exception {
 
-        if (parameter.value() == null && parameter.jdbcType() == 0) {
-            statement.setNull(parameter.statementPosition(), Types.VARCHAR);
+        if (parameter.value() == null && parameter.psType() == 0) {
+            statement.setNull(parameter.psPosition(), Types.VARCHAR);
         } else {
             super.bindParameter(statement, parameter);
         }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java
index 03c30007a..83bfdb64d 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java
@@ -118,8 +118,8 @@ public class IngresAdapter extends JdbcAdapter {
     @Override
     public void bindParameter(PreparedStatement statement, PSParameter<?> 
parameter) throws Exception {
 
-        if (parameter.value() == null && (parameter.jdbcType() == Types.BIT)) {
-            statement.setNull(parameter.statementPosition(), Types.SMALLINT);
+        if (parameter.value() == null && (parameter.psType() == Types.BIT)) {
+            statement.setNull(parameter.psPosition(), Types.SMALLINT);
         } else {
             super.bindParameter(statement, parameter);
         }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
index 8e84c99f4..ffa747483 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
@@ -266,14 +266,14 @@ public class OracleAdapter extends JdbcAdapter {
         // Oracle doesn't support BOOLEAN even when binding NULL, so have to
         // intercept
         // NULL Boolean here, as super doesn't pass it through ExtendedType...
-        if (parameter.value() == null && parameter.jdbcType() == 
Types.BOOLEAN) {
+        if (parameter.value() == null && parameter.psType() == Types.BOOLEAN) {
             ExtendedType typeProcessor = 
getExtendedTypes().getRegisteredType(Boolean.class);
             typeProcessor.setJdbcObject(
                     statement,
                     parameter.value(),
-                    parameter.statementPosition(),
-                    parameter.jdbcType(),
-                    parameter.scale());
+                    parameter.psPosition(),
+                    parameter.psType(),
+                    parameter.psScale());
         } else {
             super.bindParameter(statement, parameter);
         }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/postgres/PostgresSelectAction.java
 
b/cayenne/src/main/java/org/apache/cayenne/dba/postgres/PostgresSelectAction.java
index 221f13429..8b375f314 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/postgres/PostgresSelectAction.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/postgres/PostgresSelectAction.java
@@ -75,13 +75,13 @@ class PostgresSelectAction extends SelectAction {
 
        private static boolean readsLargeObjects(TranslatedSelect translated) {
                for (RSColumn column : translated.resultColumns()) {
-                       if (isLargeObject(column.jdbcType())) {
+                       if (isLargeObject(column.rsType())) {
                                return true;
                        }
                }
                // a large object bound as a parameter (e.g. in a qualifier) 
also needs a transaction
                for (PSParameter binding : translated.bindings()) {
-                       if (isLargeObject(binding.jdbcType())) {
+                       if (isLargeObject(binding.psType())) {
                                return true;
                        }
                }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
index 0212e8052..3d7143679 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
@@ -142,12 +142,12 @@ public class SQLServerAdapter extends JdbcAdapter {
 
         // SQL Server driver doesn't like CLOBs and BLOBs as parameters
         if (parameter.value() == null) {
-            int jdbcType = switch (parameter.jdbcType()) {
+            int jdbcType = switch (parameter.psType()) {
                 case Types.CLOB, 0 -> Types.VARCHAR;
                 case Types.BLOB -> Types.VARBINARY;
-                default -> parameter.jdbcType();
+                default -> parameter.psType();
             };
-            statement.setNull(parameter.statementPosition(), jdbcType);
+            statement.setNull(parameter.psPosition(), jdbcType);
         } else {
             super.bindParameter(statement, parameter);
         }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java
index be1782ab2..98450cfa1 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java
@@ -147,12 +147,12 @@ public class SybaseAdapter extends JdbcAdapter {
 
         // Sybase driver doesn't like CLOBs and BLOBs as parameters
         if (parameter.value() == null) {
-            int jdbcType = switch (parameter.jdbcType()) {
+            int jdbcType = switch (parameter.psType()) {
                 case Types.CLOB, 0 -> Types.VARCHAR;
                 case Types.BLOB -> Types.VARBINARY;
-                default -> parameter.jdbcType();
+                default -> parameter.psType();
             };
-            statement.setNull(parameter.statementPosition(), jdbcType);
+            statement.setNull(parameter.psPosition(), jdbcType);
         } else {
             super.bindParameter(statement, parameter);
         }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLogger.java 
b/cayenne/src/main/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLogger.java
index c6d9bbdcc..59540dcd8 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLogger.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLogger.java
@@ -117,8 +117,8 @@ public class CompactSlf4jJdbcEventLogger extends 
Slf4jJdbcEventLogger {
                 key = attribute.getName();
             }
 
-            if (b.extendedType() != null) {
-                value = b.extendedType().toString(b.value());
+            if (b.binder() != null) {
+                value = b.binder().toString(b.value());
             } else if (b.value() == null) {
                 value = "NULL";
             } else {
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/log/Slf4jJdbcEventLogger.java 
b/cayenne/src/main/java/org/apache/cayenne/log/Slf4jJdbcEventLogger.java
index 3c9e749ca..05d3b41b2 100644
--- a/cayenne/src/main/java/org/apache/cayenne/log/Slf4jJdbcEventLogger.java
+++ b/cayenne/src/main/java/org/apache/cayenne/log/Slf4jJdbcEventLogger.java
@@ -118,8 +118,8 @@ public class Slf4jJdbcEventLogger implements 
JdbcEventLogger {
 
                                buffer.append(":");
 
-                               if (b.extendedType() != null) {
-                                       
buffer.append(b.extendedType().toString(b.value()));
+                               if (b.binder() != null) {
+                                       
buffer.append(b.binder().toString(b.value()));
                                } else if(b.value() == null) {
                                    buffer.append("NULL");
                 } else {
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/jdbc/RSColumnTest.java 
b/cayenne/src/test/java/org/apache/cayenne/access/jdbc/RSColumnTest.java
index d4c0819a8..dd5c45da8 100644
--- a/cayenne/src/test/java/org/apache/cayenne/access/jdbc/RSColumnTest.java
+++ b/cayenne/src/test/java/org/apache/cayenne/access/jdbc/RSColumnTest.java
@@ -31,22 +31,22 @@ public class RSColumnTest {
 
     @Test
     public void name() {
-        RSColumn column = new RSColumn("abc", null, 0, null, null);
-        assertEquals("abc", column.name());
+        RSColumn column = new RSColumn("abc", 0, null, null, null);
+        assertEquals("abc", column.rsName());
     }
 
     @Test
     public void label() {
-        RSColumn column = new RSColumn(null, "abc", 0, null, null);
-        assertEquals("abc", column.dataRowKey());
+        RSColumn column = new RSColumn(null, 0, "abc", null, null);
+        assertEquals("abc", column.dataRowName());
     }
 
     @Test
     public void equals() {
         // type should be ignored in the comparison
-        RSColumn column1 = new RSColumn("n1", "k1", Types.VARCHAR, null, null);
-        RSColumn column2 = new RSColumn("n1", "k1", Types.BOOLEAN, null, null);
-        RSColumn column3 = new RSColumn("n1", "k3", 0, null, null);
+        RSColumn column1 = new RSColumn("n1", Types.VARCHAR, "k1", null, null);
+        RSColumn column2 = new RSColumn("n1", Types.BOOLEAN, "k1", null, null);
+        RSColumn column3 = new RSColumn("n1", 0, "k3", null, null);
 
         assertEquals(column1, column2);
         assertFalse(column1.equals(column3));
@@ -56,9 +56,9 @@ public class RSColumnTest {
     @Test
     public void hashCodeTest() {
         // type should be ignored in the comparison
-        RSColumn column1 = new RSColumn("n1", "k1", Types.VARCHAR, null, null);
-        RSColumn column2 = new RSColumn("n1", "k1", Types.BOOLEAN, null, null);
-        RSColumn column3 = new RSColumn("n1", "k3", 0, null, null);
+        RSColumn column1 = new RSColumn("n1", Types.VARCHAR, "k1", null, null);
+        RSColumn column2 = new RSColumn("n1", Types.BOOLEAN, "k1", null, null);
+        RSColumn column3 = new RSColumn("n1", 0, "k3", null, null);
 
         assertEquals(column1.hashCode(), column2.hashCode());
 
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/ColumnDescriptorStageTest.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/ColumnDescriptorStageTest.java
index 3b74ec23e..42bde85de 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/ColumnDescriptorStageTest.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/ColumnDescriptorStageTest.java
@@ -48,6 +48,6 @@ public class ColumnDescriptorStageTest {
 
         assertEquals(1, context.getColumnDescriptors().size());
         RSColumn descriptor = context.getColumnDescriptors().iterator().next();
-        assertEquals("key", descriptor.dataRowKey());
+        assertEquals("key", descriptor.dataRowName());
     }
 }
\ No newline at end of file
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DbAdapterDelegatedSelectTranslatorIT.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DbAdapterDelegatedSelectTranslatorIT.java
index 69650cb3a..dc4acd87b 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DbAdapterDelegatedSelectTranslatorIT.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DbAdapterDelegatedSelectTranslatorIT.java
@@ -720,7 +720,7 @@ public class DbAdapterDelegatedSelectTranslatorIT {
                tr.sql();
 
                List<RSColumn> columns = Arrays.asList(tr.resultColumns());
-               columns.sort(Comparator.comparing(RSColumn::name));
+               columns.sort(Comparator.comparing(RSColumn::rsName));
 
                DbEntity entity = 
env.context().getEntityResolver().getDbEntity("PAINTING");
                List<DbAttribute> attributes = new 
ArrayList<>(entity.getAttributes());
@@ -733,9 +733,9 @@ public class DbAdapterDelegatedSelectTranslatorIT {
                        DbAttribute attribute = attributes.get(i);
                        RSColumn descriptor = columns.get(i);
                        assertEquals(attribute, descriptor.attribute());
-                       assertEquals(attribute.getName(), descriptor.name());
-                       assertEquals(attribute.getName(), 
descriptor.dataRowKey());
-                       assertEquals(attribute.getType(), 
descriptor.jdbcType());
+                       assertEquals(attribute.getName(), descriptor.rsName());
+                       assertEquals(attribute.getName(), 
descriptor.dataRowName());
+                       assertEquals(attribute.getType(), descriptor.rsType());
                }
        }
 
@@ -750,7 +750,7 @@ public class DbAdapterDelegatedSelectTranslatorIT {
                tr.sql();
 
                List<RSColumn> columns = Arrays.asList(tr.resultColumns());
-               columns.sort(Comparator.comparing(RSColumn::name));
+               columns.sort(Comparator.comparing(RSColumn::rsName));
 
                DbEntity rootEntity = 
env.context().getEntityResolver().getDbEntity("PAINTING");
                List<DbAttribute> attributes = new 
ArrayList<>(rootEntity.getAttributes());
@@ -762,13 +762,13 @@ public class DbAdapterDelegatedSelectTranslatorIT {
                        DbAttribute attribute = attributes.get(i);
                        RSColumn descriptor = columns.get(i);
                        assertEquals(attribute, descriptor.attribute());
-                       assertEquals(attribute.getName(), descriptor.name());
+                       assertEquals(attribute.getName(), descriptor.rsName());
                        if("ARTIST".equals(attribute.getEntity().getName())) {
-                               assertEquals("toArtist." + attribute.getName(), 
descriptor.dataRowKey());
+                               assertEquals("toArtist." + attribute.getName(), 
descriptor.dataRowName());
                        } else {
-                               assertEquals(attribute.getName(), 
descriptor.dataRowKey());
+                               assertEquals(attribute.getName(), 
descriptor.dataRowName());
                        }
-                       assertEquals(attribute.getType(), 
descriptor.jdbcType());
+                       assertEquals(attribute.getType(), descriptor.rsType());
                }
        }
 
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DefaultObjectSelectTranslatorIT.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DefaultObjectSelectTranslatorIT.java
index e53b927a4..8e705bf0b 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DefaultObjectSelectTranslatorIT.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DefaultObjectSelectTranslatorIT.java
@@ -48,9 +48,9 @@ public class DefaultObjectSelectTranslatorIT {
 
         assertEquals(0, translator.bindings().length);
         assertEquals(3, translator.resultColumns().length);
-        assertEquals("ARTIST_NAME", 
translator.resultColumns()[0].dataRowKey());
-        assertEquals("DATE_OF_BIRTH", 
translator.resultColumns()[1].dataRowKey());
-        assertEquals("ARTIST_ID", translator.resultColumns()[2].dataRowKey());
+        assertEquals("ARTIST_NAME", 
translator.resultColumns()[0].dataRowName());
+        assertEquals("DATE_OF_BIRTH", 
translator.resultColumns()[1].dataRowName());
+        assertEquals("ARTIST_ID", translator.resultColumns()[2].dataRowName());
         assertFalse(translator.hasJoins());
         assertFalse(translator.suppressingDistinct());
     }
@@ -76,9 +76,9 @@ public class DefaultObjectSelectTranslatorIT {
         assertEquals("PAINTING_TITLE", 
translator.bindings()[1].attribute().getName());
 
         assertEquals(3, translator.resultColumns().length);
-        assertEquals("ARTIST_NAME", 
translator.resultColumns()[0].dataRowKey());
-        assertEquals("DATE_OF_BIRTH", 
translator.resultColumns()[1].dataRowKey());
-        assertEquals("ARTIST_ID", translator.resultColumns()[2].dataRowKey());
+        assertEquals("ARTIST_NAME", 
translator.resultColumns()[0].dataRowName());
+        assertEquals("DATE_OF_BIRTH", 
translator.resultColumns()[1].dataRowName());
+        assertEquals("ARTIST_ID", translator.resultColumns()[2].dataRowName());
 
         assertTrue(translator.hasJoins());
         assertFalse(translator.suppressingDistinct());
@@ -108,16 +108,16 @@ public class DefaultObjectSelectTranslatorIT {
         assertEquals(0, translator.bindings().length);
 
         assertEquals(9, translator.resultColumns().length);
-        assertEquals("ESTIMATED_PRICE", 
translator.resultColumns()[0].dataRowKey());
-        assertEquals("PAINTING_DESCRIPTION", 
translator.resultColumns()[1].dataRowKey());
-        assertEquals("PAINTING_TITLE", 
translator.resultColumns()[2].dataRowKey());
-        assertEquals("ARTIST_ID", translator.resultColumns()[3].dataRowKey());
-        assertEquals("GALLERY_ID", translator.resultColumns()[4].dataRowKey());
-        assertEquals("PAINTING_ID", 
translator.resultColumns()[5].dataRowKey());
-
-        assertEquals("toArtist.ARTIST_ID", 
translator.resultColumns()[6].dataRowKey());
-        assertEquals("toArtist.DATE_OF_BIRTH", 
translator.resultColumns()[7].dataRowKey());
-        assertEquals("toArtist.ARTIST_NAME", 
translator.resultColumns()[8].dataRowKey());
+        assertEquals("ESTIMATED_PRICE", 
translator.resultColumns()[0].dataRowName());
+        assertEquals("PAINTING_DESCRIPTION", 
translator.resultColumns()[1].dataRowName());
+        assertEquals("PAINTING_TITLE", 
translator.resultColumns()[2].dataRowName());
+        assertEquals("ARTIST_ID", translator.resultColumns()[3].dataRowName());
+        assertEquals("GALLERY_ID", 
translator.resultColumns()[4].dataRowName());
+        assertEquals("PAINTING_ID", 
translator.resultColumns()[5].dataRowName());
+
+        assertEquals("toArtist.ARTIST_ID", 
translator.resultColumns()[6].dataRowName());
+        assertEquals("toArtist.DATE_OF_BIRTH", 
translator.resultColumns()[7].dataRowName());
+        assertEquals("toArtist.ARTIST_NAME", 
translator.resultColumns()[8].dataRowName());
 
         assertTrue(translator.hasJoins());
         assertFalse(translator.suppressingDistinct());
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/sqltemplate/DefaultSQLTemplateTranslatorTest.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/sqltemplate/DefaultSQLTemplateTranslatorTest.java
index ac02e77f2..f47286e94 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/sqltemplate/DefaultSQLTemplateTranslatorTest.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/sqltemplate/DefaultSQLTemplateTranslatorTest.java
@@ -241,7 +241,7 @@ public class DefaultSQLTemplateTranslatorTest {
 
     private void assertBindingType(Integer expectedType, Object binding) {
         assertTrue(binding instanceof PSParameter, "Not a binding!");
-        assertEquals(expectedType, ((PSParameter) binding).jdbcType());
+        assertEquals(expectedType, ((PSParameter) binding).psType());
     }
 
 }
\ No newline at end of file
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLoggerTest.java
 
b/cayenne/src/test/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLoggerTest.java
index 89c043df1..2877fe339 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLoggerTest.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLoggerTest.java
@@ -111,6 +111,6 @@ public class CompactSlf4jJdbcEventLoggerTest {
 
     private PSParameter createBinding(String name, int position, Object 
object, ExtendedType type){
         DbAttribute attribute = new DbAttribute(name);
-        return new PSParameter(attribute.getType(), -1, attribute, position, 
object, type);
+        return new PSParameter(object, position, attribute.getType(), -1, 
type, attribute);
     }
 }

Reply via email to