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 a2a51df1d2f66766af49f960d31981b777c54107
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sun Jun 28 14:04:33 2026 -0400

    cleanup - trimming down ColumnDescriptor and turning it into a record
---
 .../reader/CryptoRowReaderFactoryDecorator.java    |   6 +-
 .../transformer/DefaultTransformerFactory.java     |   6 +-
 .../apache/cayenne/velocity/ResultDirective.java   |  16 +-
 .../VelocitySQLTemplateTranslator_SelectTest.java  |  20 +-
 .../cayenne/access/PrefetchProcessorJointNode.java |  12 +-
 .../apache/cayenne/access/jdbc/BatchAction.java    |  13 +-
 .../cayenne/access/jdbc/ColumnDescriptor.java      | 273 +--------------------
 .../cayenne/access/jdbc/ProcedureAction.java       |  12 +-
 .../cayenne/access/jdbc/RowDescriptorBuilder.java  |  50 ++--
 .../cayenne/access/jdbc/SQLTemplateAction.java     |   5 +-
 .../cayenne/access/jdbc/reader/BaseRowReader.java  |   4 +-
 .../access/jdbc/reader/EmbeddableRowReader.java    |   4 +-
 .../access/jdbc/reader/EntityRowReader.java        |   8 +-
 .../cayenne/access/jdbc/reader/IdRowReader.java    |   2 +-
 .../access/jdbc/reader/ScalarRowReader.java        |   2 +-
 .../translator/select/ColumnDescriptorStage.java   |   5 +-
 .../translator/sqltemplate/directive/Result.java   |  14 +-
 .../cayenne/dba/oracle/OracleProcedureAction.java  |  10 +-
 .../cayenne/dba/postgres/PostgresSelectAction.java |   2 +-
 .../access/DataContextProcedureQueryIT.java        |   7 +-
 .../cayenne/access/jdbc/ColumnDescriptorTest.java  |  69 +-----
 .../select/ColumnDescriptorStageTest.java          |   2 +-
 .../DbAdapterDelegatedSelectTranslatorIT.java      |  22 +-
 .../select/DefaultObjectSelectTranslatorIT.java    |  32 +--
 .../org/apache/cayenne/query/ProcedureCallIT.java  |   7 +-
 25 files changed, 156 insertions(+), 447 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 549f693a7..b48cdb692 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
@@ -100,7 +100,7 @@ public class CryptoRowReaderFactoryDecorator extends 
DefaultRowReaderFactory {
         ExtendedType[] encryptedConverters = new ExtendedType[len];
 
         for (int i = 0; i < len; i++) {
-            DbAttribute attribute = originalColumns[i].getAttribute();
+            DbAttribute attribute = originalColumns[i].attribute();
 
             ExtendedType t = originalConverters[i];
 
@@ -143,8 +143,8 @@ public class CryptoRowReaderFactoryDecorator extends 
DefaultRowReaderFactory {
 
         DecoratedScalarRowReader(ColumnDescriptor descriptor, RowReader<?> 
delegateReader) {
             this.delegateReader = delegateReader;
-            if(descriptor.getAttribute() != null && 
columnMapper.isEncrypted(descriptor.getAttribute())) {
-                this.valueDecryptor = 
valueTransformerFactory.decryptor(descriptor.getAttribute());
+            if(descriptor.attribute() != null && 
columnMapper.isEncrypted(descriptor.attribute())) {
+                this.valueDecryptor = 
valueTransformerFactory.decryptor(descriptor.attribute());
                 this.bytesDecryptor = bytesTransformerFactory.decryptor();
             } else {
                 this.valueDecryptor = null;
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 958cc013c..1d76f5097 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
@@ -61,7 +61,7 @@ public class DefaultTransformerFactory implements 
TransformerFactory {
 
         for (int i = 0; i < len; i++) {
 
-            DbAttribute a = columns[i].getAttribute();
+            DbAttribute a = columns[i].attribute();
             if (a != null && columnMapper.isEncrypted(a)) {
                 if (cryptoColumns == null) {
                     cryptoColumns = new ArrayList<>(len - i);
@@ -80,8 +80,8 @@ public class DefaultTransformerFactory implements 
TransformerFactory {
             for (int i = 0; i < dlen; i++) {
 
                 ColumnDescriptor cd = columns[cryptoColumns.get(i)];
-                mapKeys[i] = cd.getDataRowKey();
-                transformers[i] = 
transformerFactory.decryptor(cd.getAttribute());
+                mapKeys[i] = cd.dataRowKey();
+                transformers[i] = transformerFactory.decryptor(cd.attribute());
             }
 
             return new DefaultMapTransformer(mapKeys, transformers, 
bytesTransformerFactory.decryptor());
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 43a845496..c8a869160 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
@@ -126,23 +126,17 @@ public class ResultDirective extends Directive {
                // determine what we want to name this column in a resulting 
DataRow...
                String label = (!Util.isEmptyString(dataRowKey)) ? dataRowKey : 
(!Util.isEmptyString(alias)) ? alias : null;
 
-               ColumnDescriptor columnDescriptor = new ColumnDescriptor();
-               columnDescriptor.setName(column);
-               columnDescriptor.setDataRowKey(label);
-
                String type = getChildAsString(context, node, 1);
-               if (type != null) {
-                       columnDescriptor.setJavaClass(guessType(type));
-               }
+               String javaClass = (type != null) ? guessType(type) : null;
 
                // TODO: andrus 6/27/2007 - this is an unofficial jdbcType 
parameter
                // that is added
                // temporarily pending CAY-813 implementation for the sake of 
EJBQL
                // query...
-               Object jdbcType = getChild(context, node, 4);
-               if (jdbcType instanceof Number) {
-                       columnDescriptor.setJdbcType(((Number) 
jdbcType).intValue());
-               }
+               Object jdbcTypeChild = getChild(context, node, 4);
+               int jdbcType = (jdbcTypeChild instanceof Number) ? ((Number) 
jdbcTypeChild).intValue() : 0;
+
+               ColumnDescriptor columnDescriptor = new 
ColumnDescriptor(column, label, jdbcType, javaClass, null);
 
                writer.write(column);
 
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 f49d13b92..01d659d52 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].getName());
-               assertNull(compiled.resultColumns()[0].getJavaClass());
+               assertEquals("A", compiled.resultColumns()[0].name());
+               assertNull(compiled.resultColumns()[0].javaClass());
        }
 
        @Test
@@ -81,8 +81,8 @@ public class VelocitySQLTemplateTranslator_SelectTest {
                assertEquals(0, compiled.bindings().length);
 
                assertEquals(1, compiled.resultColumns().length);
-               assertEquals("A", compiled.resultColumns()[0].getName());
-               assertEquals("java.lang.String", 
compiled.resultColumns()[0].getJavaClass());
+               assertEquals("A", compiled.resultColumns()[0].name());
+               assertEquals("java.lang.String", 
compiled.resultColumns()[0].javaClass());
        }
 
        @Test
@@ -96,9 +96,9 @@ public class VelocitySQLTemplateTranslator_SelectTest {
 
                assertEquals(1, compiled.resultColumns().length);
                ColumnDescriptor column = compiled.resultColumns()[0];
-               assertEquals("A", column.getName());
-               assertEquals("B", column.getDataRowKey());
-               assertEquals("java.lang.String", column.getJavaClass());
+               assertEquals("A", column.name());
+               assertEquals("B", column.dataRowKey());
+               assertEquals("java.lang.String", column.javaClass());
        }
 
        @Test
@@ -111,8 +111,8 @@ public class VelocitySQLTemplateTranslator_SelectTest {
                assertEquals(0, compiled.bindings().length);
 
                assertEquals(3, compiled.resultColumns().length);
-               assertEquals("A", compiled.resultColumns()[0].getName());
-               assertEquals("B", compiled.resultColumns()[1].getName());
-               assertEquals("C", compiled.resultColumns()[2].getName());
+               assertEquals("A", compiled.resultColumns()[0].name());
+               assertEquals("B", compiled.resultColumns()[1].name());
+               assertEquals("C", compiled.resultColumns()[2].name());
        }
 }
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 30487c577..8440a48a1 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].getDataRowKey());
-            id.put(columns[idIndex].getName(), value);
+            Object value = flatRow.get(columns[idIndex].dataRowKey());
+            id.put(columns[idIndex].name(), value);
         }
 
         return id;
@@ -137,7 +137,7 @@ class PrefetchProcessorJointNode extends 
PrefetchProcessorNode {
 
         // extract subset of flat row columns, recasting to the target keys
         for (ColumnDescriptor column : columns) {
-            row.put(column.getName(), flatRow.get(column.getDataRowKey()));
+            row.put(column.name(), flatRow.get(column.dataRowKey()));
         }
 
         // since JDBC row reader won't inject JOINED entity name, we have to 
detect it here...
@@ -247,9 +247,7 @@ class PrefetchProcessorJointNode extends 
PrefetchProcessorNode {
         ColumnDescriptor column = map.get(name);
 
         if (column == null) {
-            column = new ColumnDescriptor();
-            column.setName(name);
-            column.setDataRowKey(label);
+            column = new ColumnDescriptor(name, label, 0, null, null);
             map.put(name, column);
         }
 
@@ -275,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].getName())) {
+                if (pk.getName().equals(columns[j].name())) {
                     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 5b7319800..a5bb47938 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
@@ -42,6 +42,7 @@ import org.apache.cayenne.query.UpdateBatchQuery;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.ArrayList;
@@ -277,9 +278,15 @@ public class BatchAction extends BaseSQLAction {
                                ColumnDescriptor[] columns = new 
ColumnDescriptor[1];
 
                                // use column name from result set, but type 
and Java class from DB attribute
-                               columns[0] = new 
ColumnDescriptor(keysRS.getMetaData(), 1);
-                               columns[0].setJdbcType(key.getType());
-                               
columns[0].setJavaClass(typeForGeneratedPK(key));
+                               ResultSetMetaData md = keysRS.getMetaData();
+                               String columnName = md.getColumnLabel(1);
+                               if (columnName == null || columnName.isEmpty()) 
{
+                                       columnName = md.getColumnName(1);
+                                       if (columnName == null || 
columnName.isEmpty()) {
+                                               columnName = "column_1";
+                                       }
+                               }
+                               columns[0] = new ColumnDescriptor(columnName, 
columnName, key.getType(), typeForGeneratedPK(key), null);
                                builder.setColumns(columns);
                        } else {
                                builder.setResultSet(keysRS);
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/ColumnDescriptor.java 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/ColumnDescriptor.java
index 64a75f2d3..8b1df6876 100644
--- a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/ColumnDescriptor.java
+++ b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/ColumnDescriptor.java
@@ -19,157 +19,24 @@
 
 package org.apache.cayenne.access.jdbc;
 
-import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ProcedureParameter;
-import org.apache.cayenne.util.ToStringBuilder;
 
-import java.sql.ResultSetMetaData;
-import java.sql.SQLException;
 import java.util.Objects;
 
 /**
  * A descriptor of a ResultSet column.
- * 
- * @since 1.1
  */
-public class ColumnDescriptor {
+public record ColumnDescriptor(String name, String dataRowKey, int jdbcType, 
String javaClass, DbAttribute attribute) {
 
-    protected DbAttribute attribute;
-    protected String tableName;
-    protected String procedureName;
-
-    // identifies column in result set
-    protected String name;
-    protected String namePrefix;
-
-    // identifies column in a DataRow
-    protected String dataRowKey;
-
-    protected int jdbcType;
-    protected String javaClass;
-
-    /**
-     * @since 4.0
-     */
-    protected boolean isExpression;
-
-    /**
-     * Creates a ColumnDescriptor
-     */
-    public ColumnDescriptor() {
-    }
-
-    /**
-     * Creates a column descriptor with user-specified parameters.
-     * 
-     * @since 3.1
-     */
-    public ColumnDescriptor(String columnName, int jdbcType) {
-        this(columnName, jdbcType, TypesMapping.getJavaBySqlType(jdbcType));
-    }
-
-    /**
-     * @since 4.0
-     */
-    public ColumnDescriptor(String columnName, int jdbcType, String javaClass) 
{
-        this.name = columnName;
-        this.dataRowKey = columnName;
-        this.jdbcType = jdbcType;
-        this.javaClass = javaClass;
-    }
-
-    /**
-     * Creates a ColumnDescriptor from Cayenne DbAttribute.
-     * 
-     * @since 1.2
-     */
-    public ColumnDescriptor(DbAttribute attribute, String tableAlias) {
-        this(attribute.getName(), attribute.getType());
-
-        this.attribute = attribute;
-        this.namePrefix = tableAlias;
-        this.javaClass = attribute.getJavaClassName();
-
-        if (attribute.getEntity() != null) {
-            this.tableName = attribute.getEntity().getName();
+    public ColumnDescriptor {
+        if (dataRowKey == null) {
+            dataRowKey = name;
         }
     }
 
     /**
-     * @since 1.2
-     */
-    public ColumnDescriptor(ObjAttribute objAttribute, DbAttribute 
dbAttribute, String columnAlias) {
-        this(dbAttribute, columnAlias);
-        this.dataRowKey = objAttribute.getDbAttributePath().value();
-        this.javaClass = objAttribute.getType();
-    }
-
-    /**
-     * Creates a ColumnDescriptor from stored procedure parameter.
-     * 
-     * @since 1.2
-     */
-    public ColumnDescriptor(ProcedureParameter parameter) {
-        this(parameter.getName(), parameter.getType());
-
-        if (parameter.getProcedure() != null) {
-            this.procedureName = parameter.getProcedure().getName();
-        }
-    }
-
-    /**
-     * Creates a ColumnDescriptor using ResultSetMetaData.
-     * 
-     * @since 3.1
-     */
-    public ColumnDescriptor(String columnName, ResultSetMetaData metaData, int 
position) throws SQLException {
-        this(columnName, metaData.getColumnType(position));
-    }
-
-    /**
-     * Creates a ColumnDescriptor using ResultSetMetaData.
-     * 
-     * @since 1.2
-     */
-    public ColumnDescriptor(ResultSetMetaData metaData, int position) throws 
SQLException {
-        this(getColumnNameFromMeta(metaData, position), metaData, position);
-    }
-
-    private static String getColumnNameFromMeta(ResultSetMetaData metaData, 
int position) throws SQLException {
-        String name = metaData.getColumnLabel(position);
-        if (name == null || name.isEmpty()) {
-            name = metaData.getColumnName(position);
-
-            if (name == null || name.isEmpty()) {
-                name = "column_" + position;
-            }
-        }
-        return name;
-    }
-
-    /**
-     * Returns a DbAttribute for this column. Since columns descriptors can be
-     * initialized in a context where a DbAttribite is unknown, this method may
-     * return null.
-     * 
-     * @since 4.0
-     */
-    public DbAttribute getAttribute() {
-        return attribute;
-    }
-
-    public void setAttribute(DbAttribute attribute) {
-        this.attribute = attribute;
-    }
-
-    /**
-     * Returns true if another object is a ColumnDescriptor with the same name,
-     * name prefix, table and procedure names. Other fields are ignored in the
-     * equality test.
-     * 
-     * @since 1.2
+     * Returns true if another object is a ColumnDescriptor with the same name 
and data row key. Other fields are
+     * ignored in the equality test.
      */
     @Override
     public boolean equals(Object o) {
@@ -178,10 +45,7 @@ public class ColumnDescriptor {
         }
 
         return Objects.equals(name, rhs.name)
-                && Objects.equals(namePrefix, rhs.namePrefix)
-                && Objects.equals(procedureName, rhs.procedureName)
-                && Objects.equals(dataRowKey, rhs.dataRowKey)
-                && Objects.equals(tableName, rhs.tableName);
+                && Objects.equals(dataRowKey, rhs.dataRowKey);
     }
 
     /**
@@ -189,127 +53,6 @@ public class ColumnDescriptor {
      */
     @Override
     public int hashCode() {
-        return Objects.hash(name, namePrefix, procedureName, tableName, 
dataRowKey);
-    }
-
-    /**
-     * @since 1.2
-     */
-    @Override
-    public String toString() {
-        ToStringBuilder builder = new ToStringBuilder(this);
-        builder.append("namePrefix", namePrefix);
-        builder.append("name", getName());
-        builder.append("dataRowKey", getDataRowKey());
-        builder.append("tableName", getTableName());
-        builder.append("procedureName", getProcedureName());
-        builder.append("javaClass", getJavaClass());
-        builder.append("jdbcType", getJdbcType());
-        return builder.toString();
-    }
-
-    /**
-     * Returns "qualifiedColumnName" property.
-     * 
-     * @since 1.2
-     */
-    public String getQualifiedColumnName() {
-        return (namePrefix != null) ? namePrefix + '.' + name : name;
-    }
-
-    public int getJdbcType() {
-        return jdbcType;
-    }
-
-    /**
-     * Returns column name. Name is an unqualified column name in a query.
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * @since 4.0
-     */
-    public String getNamePrefix() {
-        return namePrefix;
-    }
-
-    public void setJdbcType(int i) {
-        jdbcType = i;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getJavaClass() {
-        return javaClass;
-    }
-
-    public void setJavaClass(String string) {
-        javaClass = string;
-    }
-
-    /**
-     * Returns the name of the parent table.
-     * 
-     * @since 1.2
-     */
-    public String getTableName() {
-        return tableName;
-    }
-
-    /**
-     * @since 1.2
-     */
-    public void setTableName(String tableName) {
-        this.tableName = tableName;
-    }
-
-    /**
-     * Returns the name of the parent stored procedure.
-     * 
-     * @since 1.2
-     */
-    public String getProcedureName() {
-        return procedureName;
-    }
-
-    /**
-     * @since 1.2
-     */
-    public void setProcedureName(String procedureName) {
-        this.procedureName = procedureName;
-    }
-
-    /**
-     * @since 3.0
-     */
-    public String getDataRowKey() {
-        return dataRowKey != null ? dataRowKey : getName();
-    }
-
-    /**
-     * @since 3.0
-     */
-    public void setDataRowKey(String dataRowKey) {
-        this.dataRowKey = dataRowKey;
-    }
-
-    /**
-     * @since 4.0
-     * @param isExpression is this column is an expression
-     */
-    public void setIsExpression(boolean isExpression) {
-        this.isExpression = isExpression;
-    }
-
-    /**
-     * @since 4.0
-     * @return is this column is an expression
-     */
-    public boolean isExpression() {
-        return isExpression;
+        return Objects.hash(name, dataRowKey);
     }
 }
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 4d292715b..cb53ff0c4 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
@@ -27,6 +27,7 @@ import org.apache.cayenne.access.translator.ParameterBinding;
 import org.apache.cayenne.access.translator.procedure.TranslatedProcedure;
 import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.query.ProcedureQuery;
@@ -219,11 +220,12 @@ public class ProcedureAction extends BaseSQLAction {
                                result = new DataRow(2);
                        }
 
-                       ColumnDescriptor descriptor = new 
ColumnDescriptor(parameter);
-                       ExtendedType type = 
dataNode.getAdapter().getExtendedTypes().getRegisteredType(descriptor.getJavaClass());
-                       Object val = type.materializeObject(statement, i + 1, 
descriptor.getJdbcType());
+                       ColumnDescriptor descriptor = new ColumnDescriptor(
+                                       parameter.getName(), 
parameter.getName(), parameter.getType(), 
TypesMapping.getJavaBySqlType(parameter.getType()), null);
+                       ExtendedType type = 
dataNode.getAdapter().getExtendedTypes().getRegisteredType(descriptor.javaClass());
+                       Object val = type.materializeObject(statement, i + 1, 
descriptor.jdbcType());
 
-                       result.put(descriptor.getDataRowKey(), val);
+                       result.put(descriptor.dataRowKey(), val);
                }
 
                if (result != null && !result.isEmpty()) {
@@ -232,7 +234,7 @@ public class ProcedureAction extends BaseSQLAction {
                        delegate.nextRows(query, 
Collections.singletonList(result));
                }
        }
-       
+
        protected void initStatement(CallableStatement statement) throws 
Exception {
                QueryMetadata queryMetadata = 
query.getMetaData(dataNode.getEntityResolver());
                int statementFetchSize = queryMetadata.getStatementFetchSize();
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java
index 3068b2c83..68c6a7b28 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java
@@ -21,6 +21,7 @@ package org.apache.cayenne.access.jdbc;
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.access.types.ExtendedTypeMap;
+import org.apache.cayenne.dba.TypesMapping;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -80,10 +81,10 @@ public class RowDescriptorBuilder {
                     "Can't build RowDescriptor, both 'columns' and 
'resultSetMetadata' are null");
         }
 
-        performTransformAndTypeOverride(columnsForRD);
+        columnsForRD = performTransformAndTypeOverride(columnsForRD);
         ExtendedType[] converters = new ExtendedType[columnsForRD.length];
         for (int i = 0; i < columnsForRD.length; i++) {
-            converters[i] = 
typeMap.getRegisteredType(columnsForRD[i].getJavaClass());
+            converters[i] = 
typeMap.getRegisteredType(columnsForRD[i].javaClass());
         }
 
         return new RowDescriptor(columnsForRD, converters);
@@ -129,8 +130,8 @@ public class RowDescriptorBuilder {
 
             // validate uniqueness of names
             if(validateDuplicateColumnNames) {
-                if(!uniqueNames.add(descriptor.getDataRowKey())) {
-                    duplicates.add(descriptor.getDataRowKey());
+                if(!uniqueNames.add(descriptor.dataRowKey())) {
+                    duplicates.add(descriptor.dataRowKey());
                 }
             }
             rsColumns[outputLen] = descriptor;
@@ -166,9 +167,9 @@ public class RowDescriptorBuilder {
         for (int i = 0; i < len; i++) {
             if (columnArray[i] != null) {
                 if(mergeColumnsWithRsMetadata) {
-                    return new ColumnDescriptor(rowKey, 
resultSetMetadata.getColumnType(position), columnArray[position - 
1].getJavaClass());
+                    return new ColumnDescriptor(rowKey, rowKey, 
resultSetMetadata.getColumnType(position), columnArray[position - 
1].javaClass(), null);
                 } else {
-                    String columnRowKey = columnArray[i].getDataRowKey();
+                    String columnRowKey = columnArray[i].dataRowKey();
 
                     // TODO: andrus, 10/14/2009 - 'equalsIgnoreCase' check can 
result in
                     // subtle bugs in DBs with case-sensitive column names (or 
when quotes are
@@ -181,7 +182,8 @@ public class RowDescriptorBuilder {
             }
         }
         // columnArray doesn't contain ColumnDescriptor for specified column
-        return new ColumnDescriptor(rowKey, resultSetMetadata, position);
+        int jdbcType = resultSetMetadata.getColumnType(position);
+        return new ColumnDescriptor(rowKey, rowKey, jdbcType, 
TypesMapping.getJavaBySqlType(jdbcType), null);
     }
 
     /**
@@ -199,21 +201,35 @@ public class RowDescriptorBuilder {
         return name;
     }
 
-    private void performTransformAndTypeOverride(ColumnDescriptor[] 
columnArray) {
-        if (caseTransformer != null) {
-            for (ColumnDescriptor aColumnArray : columnArray) {
-                
aColumnArray.setDataRowKey(caseTransformer.apply(aColumnArray.getDataRowKey()));
-                
aColumnArray.setName(caseTransformer.apply(aColumnArray.getName()));
-            }
+    private ColumnDescriptor[] 
performTransformAndTypeOverride(ColumnDescriptor[] columnArray) {
+        if (caseTransformer == null && typeOverrides == null) {
+            return columnArray;
         }
-        if (typeOverrides != null) {
-            for (ColumnDescriptor aColumnArray : columnArray) {
-                String type = typeOverrides.get(aColumnArray.getName());
+
+        ColumnDescriptor[] result = new ColumnDescriptor[columnArray.length];
+        for (int i = 0; i < columnArray.length; i++) {
+            ColumnDescriptor column = columnArray[i];
+
+            String name = column.name();
+            String dataRowKey = column.dataRowKey();
+            String javaClass = column.javaClass();
+
+            if (caseTransformer != null) {
+                name = caseTransformer.apply(name);
+                dataRowKey = caseTransformer.apply(dataRowKey);
+            }
+
+            // type overrides are keyed by the (possibly transformed) column 
name
+            if (typeOverrides != null) {
+                String type = typeOverrides.get(name);
                 if (type != null) {
-                    aColumnArray.setJavaClass(type);
+                    javaClass = type;
                 }
             }
+
+            result[i] = new ColumnDescriptor(name, dataRowKey, 
column.jdbcType(), javaClass, 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 958651c94..a5afa378f 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
@@ -306,9 +306,8 @@ public class SQLTemplateAction implements SQLAction {
         int size = query.getResultColumnsTypes().size();
         ColumnDescriptor[] columnDescriptors = new ColumnDescriptor[size];
         for (int i = 0; i < size; i++) {
-            ColumnDescriptor columnDescriptor = new ColumnDescriptor();
-            
columnDescriptor.setJavaClass(query.getResultColumnsTypes().get(i).getCanonicalName());
-            columnDescriptors[i] = columnDescriptor;
+            // only the Java class is known here; name and type are resolved 
later from ResultSet metadata
+            columnDescriptors[i] = new ColumnDescriptor(null, null, 0, 
query.getResultColumnsTypes().get(i).getCanonicalName(), null);
         }
         return columnDescriptors;
     }
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 adeab6d76..fb26058dd 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
@@ -50,8 +50,8 @@ abstract class BaseRowReader<T> implements RowReader<T> {
         this.types = new int[width];
 
         for (int i = 0; i < width; i++) {
-            labels[i] = columns[i].getDataRowKey();
-            types[i] = columns[i].getJdbcType();
+            labels[i] = columns[i].dataRowKey();
+            types[i] = columns[i].jdbcType();
         }
     }
 
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 e520637c4..c08025669 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
@@ -52,8 +52,8 @@ class EmbeddableRowReader implements RowReader<DataRow> {
         ColumnDescriptor[] columns = descriptor.getColumns();
         for (int i = 0; i < segmentWidth; i++) {
             this.converters[i] = converters[startIndex + i];
-            types[i] = columns[startIndex + i].getJdbcType();
-            labels[i] = segment.getFields().get(columns[startIndex 
+i].getName());
+            types[i] = columns[startIndex + i].jdbcType();
+            labels[i] = segment.getFields().get(columns[startIndex +i].name());
         }
         this.mapCapacity = (int) Math.ceil(segmentWidth / 0.75);
     }
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 63a300003..4edb97a5f 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
@@ -60,17 +60,17 @@ class EntityRowReader implements RowReader<DataRow> {
         ColumnDescriptor[] columns = descriptor.getColumns();
         for (int i = 0; i < segmentWidth; i++) {
             this.converters[i] = converters[startIndex + i];
-            types[i] = columns[startIndex + i].getJdbcType();
+            types[i] = columns[startIndex + i].jdbcType();
 
             // 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].getDataRowKey().contains(".")) {
+            if (columns[startIndex + i].dataRowKey().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].getDataRowKey();
+                labels[i] = columns[startIndex + i].dataRowKey();
             } else {
-                labels[i] = segmentMetadata.getColumnPath(columns[startIndex + 
i].getDataRowKey());
+                labels[i] = segmentMetadata.getColumnPath(columns[startIndex + 
i].dataRowKey());
             }
         }
         this.mapCapacity = (int) Math.ceil(segmentWidth / 0.75);
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 b48da177f..af004af66 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
@@ -61,7 +61,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].getName());
+            DbAttribute a = dbEntity.getAttribute(columns[i].name());
             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 2ec0d588b..bb36b6e86 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
@@ -39,7 +39,7 @@ class ScalarRowReader<T> implements RowReader<T> {
     ScalarRowReader(RowDescriptor descriptor, ScalarResultSegment 
segmentMetadata) {
         int scalarIndex = segmentMetadata.getColumnOffset();
         this.converter = descriptor.getConverters()[scalarIndex];
-        this.type = descriptor.getColumns()[scalarIndex].getJdbcType();
+        this.type = descriptor.getColumns()[scalarIndex].jdbcType();
         this.index = scalarIndex + 1;
     }
 
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 20d5eb8ae..eb43855aa 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
@@ -46,9 +46,8 @@ class ColumnDescriptorStage implements TranslationStage {
                 name = "__c" + i++;
             }
 
-            ColumnDescriptor descriptor = new ColumnDescriptor(name, 
resultNode.getJdbcType(), resultNode.getJavaType());
-            descriptor.setAttribute(attribute);
-            descriptor.setDataRowKey(resultNode.getDataRowKey());
+            ColumnDescriptor descriptor = new ColumnDescriptor(
+                    name, resultNode.getDataRowKey(), 
resultNode.getJdbcType(), resultNode.getJavaType(), attribute);
 
             context.getColumnDescriptors().add(descriptor);
         }
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 6e705d662..19c7cb978 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
@@ -75,14 +75,11 @@ public class Result implements Directive {
     @Override
     public void apply(Context context, ASTExpression... expressions) {
 
-        ColumnDescriptor columnDescriptor = new ColumnDescriptor();
-
         String column = expressions[0].evaluateAsString(context);
-        columnDescriptor.setName(column);
 
+        String javaClass = null;
         if (expressions.length > 1) {
-            String type = expressions[1].evaluateAsString(context);
-            columnDescriptor.setJavaClass(guessType(type));
+            javaClass = guessType(expressions[1].evaluateAsString(context));
         }
 
         String alias = null;
@@ -97,14 +94,13 @@ public class Result implements Directive {
 
         // determine what we want to name this column in a resulting DataRow...
         String label = (!Util.isEmptyString(dataRowKey)) ? dataRowKey : 
(!Util.isEmptyString(alias)) ? alias : null;
-        columnDescriptor.setDataRowKey(label);
 
+        int jdbcType = 0;
         if (expressions.length > 4) {
-            int jdbcType = (int) expressions[4].evaluateAsLong(context);
-            columnDescriptor.setJdbcType(jdbcType);
+            jdbcType = (int) expressions[4].evaluateAsLong(context);
         }
 
-        context.addColumnDescriptor(columnDescriptor);
+        context.addColumnDescriptor(new ColumnDescriptor(column, label, 
jdbcType, javaClass, null));
 
         context.getBuilder().append(column);
         if (!Util.isEmptyString(alias) && !alias.equals(column)) {
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleProcedureAction.java
 
b/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleProcedureAction.java
index b0e9fca7f..50287e905 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleProcedureAction.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleProcedureAction.java
@@ -31,6 +31,7 @@ import org.apache.cayenne.access.OperationObserver;
 import org.apache.cayenne.access.jdbc.ColumnDescriptor;
 import org.apache.cayenne.access.jdbc.ProcedureAction;
 import org.apache.cayenne.access.jdbc.RowDescriptor;
+import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.query.ProcedureQuery;
@@ -79,12 +80,13 @@ class OracleProcedureAction extends ProcedureAction {
                                        result = new DataRow(2);
                                }
 
-                               ColumnDescriptor descriptor = new 
ColumnDescriptor(parameter);
+                               ColumnDescriptor descriptor = new 
ColumnDescriptor(
+                                               parameter.getName(), 
parameter.getName(), parameter.getType(), 
TypesMapping.getJavaBySqlType(parameter.getType()), null);
                                ExtendedType type = 
dataNode.getAdapter().getExtendedTypes()
-                                               
.getRegisteredType(descriptor.getJavaClass());
-                               Object val = type.materializeObject(statement, 
i + 1, descriptor.getJdbcType());
+                                               
.getRegisteredType(descriptor.javaClass());
+                               Object val = type.materializeObject(statement, 
i + 1, descriptor.jdbcType());
 
-                               result.put(descriptor.getDataRowKey(), val);
+                               result.put(descriptor.dataRowKey(), val);
                        }
                }
 
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 0edc106ad..e7993a564 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,7 +75,7 @@ class PostgresSelectAction extends SelectAction {
 
        private static boolean readsLargeObjects(TranslatedSelect translated) {
                for (ColumnDescriptor column : translated.resultColumns()) {
-                       if (isLargeObject(column.getJdbcType())) {
+                       if (isLargeObject(column.jdbcType())) {
                                return true;
                        }
                }
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/DataContextProcedureQueryIT.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/DataContextProcedureQueryIT.java
index 3a7d9fd28..c8c0c4479 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/DataContextProcedureQueryIT.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/DataContextProcedureQueryIT.java
@@ -21,6 +21,7 @@ package org.apache.cayenne.access;
 
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.access.jdbc.ColumnDescriptor;
+import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.log.NoopJdbcEventLogger;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.query.CapsStrategy;
@@ -349,9 +350,9 @@ public class DataContextProcedureQueryIT  {
         ColumnDescriptor[] columns = new ColumnDescriptor[3];
 
         // read ID as Long, and everything else as default types
-        columns[0] = new ColumnDescriptor("ARTIST_ID", Types.BIGINT);
-        columns[1] = new ColumnDescriptor("ARTIST_NAME", Types.CHAR);
-        columns[2] = new ColumnDescriptor("DATE_OF_BIRTH", Types.DATE);
+        columns[0] = new ColumnDescriptor("ARTIST_ID", "ARTIST_ID", 
Types.BIGINT, TypesMapping.getJavaBySqlType(Types.BIGINT), null);
+        columns[1] = new ColumnDescriptor("ARTIST_NAME", "ARTIST_NAME", 
Types.CHAR, TypesMapping.getJavaBySqlType(Types.CHAR), null);
+        columns[2] = new ColumnDescriptor("DATE_OF_BIRTH", "DATE_OF_BIRTH", 
Types.DATE, TypesMapping.getJavaBySqlType(Types.DATE), null);
         q.addResultDescriptor(columns);
 
         List<?> rows = runProcedureSelect(q);
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/jdbc/ColumnDescriptorTest.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/jdbc/ColumnDescriptorTest.java
index f171db9f6..afaee929e 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/jdbc/ColumnDescriptorTest.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/jdbc/ColumnDescriptorTest.java
@@ -19,8 +19,6 @@
 
 package org.apache.cayenne.access.jdbc;
 
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
 import org.junit.jupiter.api.Test;
 
 import java.sql.Types;
@@ -33,56 +31,22 @@ public class ColumnDescriptorTest {
 
     @Test
     public void name() {
-        ColumnDescriptor column = new ColumnDescriptor();
-        column.setName("abc");
-        assertEquals("abc", column.getName());
+        ColumnDescriptor column = new ColumnDescriptor("abc", null, 0, null, 
null);
+        assertEquals("abc", column.name());
     }
 
     @Test
     public void label() {
-        ColumnDescriptor column = new ColumnDescriptor();
-        column.setDataRowKey("abc");
-        assertEquals("abc", column.getDataRowKey());
-    }
-
-    @Test
-    public void dbAttributeConstructor() {
-        DbEntity entity = new DbEntity("entity");
-        DbAttribute a = new DbAttribute();
-        a.setName("name");
-        a.setType(Types.VARCHAR);
-        a.setEntity(entity);
-
-        entity.addAttribute(a);
-
-        ColumnDescriptor column = new ColumnDescriptor(a, null);
-        assertEquals("name", column.getName());
-        assertEquals("name", column.getQualifiedColumnName());
-        assertEquals("entity", column.getTableName());
-        assertEquals(String.class.getName(), column.getJavaClass());
-        assertEquals("name", column.getDataRowKey());
-        assertEquals(Types.VARCHAR, column.getJdbcType());
+        ColumnDescriptor column = new ColumnDescriptor(null, "abc", 0, null, 
null);
+        assertEquals("abc", column.dataRowKey());
     }
 
     @Test
     public void equals() {
-        ColumnDescriptor column1 = new ColumnDescriptor();
-        column1.setName("n1");
-        column1.namePrefix = "np1";
-        column1.setTableName("t1");
         // type should be ignored in the comparison
-        column1.setJdbcType(Types.VARCHAR);
-
-        ColumnDescriptor column2 = new ColumnDescriptor();
-        column2.setName("n1");
-        column2.namePrefix = "np1";
-        column2.setTableName("t1");
-        column2.setJdbcType(Types.BOOLEAN);
-
-        ColumnDescriptor column3 = new ColumnDescriptor();
-        column3.setName("n1");
-        column3.namePrefix = "np3";
-        column3.setTableName("t1");
+        ColumnDescriptor column1 = new ColumnDescriptor("n1", "k1", 
Types.VARCHAR, null, null);
+        ColumnDescriptor column2 = new ColumnDescriptor("n1", "k1", 
Types.BOOLEAN, null, null);
+        ColumnDescriptor column3 = new ColumnDescriptor("n1", "k3", 0, null, 
null);
 
         assertEquals(column1, column2);
         assertFalse(column1.equals(column3));
@@ -91,23 +55,10 @@ public class ColumnDescriptorTest {
 
     @Test
     public void hashCodeTest() {
-        ColumnDescriptor column1 = new ColumnDescriptor();
-        column1.setName("n1");
-        column1.namePrefix = "np1";
-        column1.setTableName("t1");
         // type should be ignored in the comparison
-        column1.setJdbcType(Types.VARCHAR);
-
-        ColumnDescriptor column2 = new ColumnDescriptor();
-        column2.setName("n1");
-        column2.namePrefix = "np1";
-        column2.setTableName("t1");
-        column2.setJdbcType(Types.BOOLEAN);
-
-        ColumnDescriptor column3 = new ColumnDescriptor();
-        column3.setName("n1");
-        column3.namePrefix = "np3";
-        column3.setTableName("t1");
+        ColumnDescriptor column1 = new ColumnDescriptor("n1", "k1", 
Types.VARCHAR, null, null);
+        ColumnDescriptor column2 = new ColumnDescriptor("n1", "k1", 
Types.BOOLEAN, null, null);
+        ColumnDescriptor column3 = new ColumnDescriptor("n1", "k3", 0, 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 092b84155..5e3eb0032 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());
         ColumnDescriptor descriptor = 
context.getColumnDescriptors().iterator().next();
-        assertEquals("key", descriptor.getDataRowKey());
+        assertEquals("key", descriptor.dataRowKey());
     }
 }
\ 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 55f7082ef..3ef4da969 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<ColumnDescriptor> columns = 
Arrays.asList(tr.resultColumns());
-               columns.sort(Comparator.comparing(ColumnDescriptor::getName));
+               columns.sort(Comparator.comparing(ColumnDescriptor::name));
 
                DbEntity entity = 
env.context().getEntityResolver().getDbEntity("PAINTING");
                List<DbAttribute> attributes = new 
ArrayList<>(entity.getAttributes());
@@ -732,10 +732,10 @@ public class DbAdapterDelegatedSelectTranslatorIT {
                for(int i=0; i<attributes.size(); i++) {
                        DbAttribute attribute = attributes.get(i);
                        ColumnDescriptor descriptor = columns.get(i);
-                       assertEquals(attribute, descriptor.getAttribute());
-                       assertEquals(attribute.getName(), descriptor.getName());
-                       assertEquals(attribute.getName(), 
descriptor.getDataRowKey());
-                       assertEquals(attribute.getType(), 
descriptor.getJdbcType());
+                       assertEquals(attribute, descriptor.attribute());
+                       assertEquals(attribute.getName(), descriptor.name());
+                       assertEquals(attribute.getName(), 
descriptor.dataRowKey());
+                       assertEquals(attribute.getType(), 
descriptor.jdbcType());
                }
        }
 
@@ -750,7 +750,7 @@ public class DbAdapterDelegatedSelectTranslatorIT {
                tr.sql();
 
                List<ColumnDescriptor> columns = 
Arrays.asList(tr.resultColumns());
-               columns.sort(Comparator.comparing(ColumnDescriptor::getName));
+               columns.sort(Comparator.comparing(ColumnDescriptor::name));
 
                DbEntity rootEntity = 
env.context().getEntityResolver().getDbEntity("PAINTING");
                List<DbAttribute> attributes = new 
ArrayList<>(rootEntity.getAttributes());
@@ -761,14 +761,14 @@ public class DbAdapterDelegatedSelectTranslatorIT {
                for(int i=0; i<attributes.size(); i++) {
                        DbAttribute attribute = attributes.get(i);
                        ColumnDescriptor descriptor = columns.get(i);
-                       assertEquals(attribute, descriptor.getAttribute());
-                       assertEquals(attribute.getName(), descriptor.getName());
+                       assertEquals(attribute, descriptor.attribute());
+                       assertEquals(attribute.getName(), descriptor.name());
                        if("ARTIST".equals(attribute.getEntity().getName())) {
-                               assertEquals("toArtist." + attribute.getName(), 
descriptor.getDataRowKey());
+                               assertEquals("toArtist." + attribute.getName(), 
descriptor.dataRowKey());
                        } else {
-                               assertEquals(attribute.getName(), 
descriptor.getDataRowKey());
+                               assertEquals(attribute.getName(), 
descriptor.dataRowKey());
                        }
-                       assertEquals(attribute.getType(), 
descriptor.getJdbcType());
+                       assertEquals(attribute.getType(), 
descriptor.jdbcType());
                }
        }
 
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 35293b4fb..bdea314f4 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].getDataRowKey());
-        assertEquals("DATE_OF_BIRTH", 
translator.resultColumns()[1].getDataRowKey());
-        assertEquals("ARTIST_ID", 
translator.resultColumns()[2].getDataRowKey());
+        assertEquals("ARTIST_NAME", 
translator.resultColumns()[0].dataRowKey());
+        assertEquals("DATE_OF_BIRTH", 
translator.resultColumns()[1].dataRowKey());
+        assertEquals("ARTIST_ID", translator.resultColumns()[2].dataRowKey());
         assertFalse(translator.hasJoins());
         assertFalse(translator.suppressingDistinct());
     }
@@ -76,9 +76,9 @@ public class DefaultObjectSelectTranslatorIT {
         assertEquals("PAINTING_TITLE", 
translator.bindings()[1].getAttribute().getName());
 
         assertEquals(3, translator.resultColumns().length);
-        assertEquals("ARTIST_NAME", 
translator.resultColumns()[0].getDataRowKey());
-        assertEquals("DATE_OF_BIRTH", 
translator.resultColumns()[1].getDataRowKey());
-        assertEquals("ARTIST_ID", 
translator.resultColumns()[2].getDataRowKey());
+        assertEquals("ARTIST_NAME", 
translator.resultColumns()[0].dataRowKey());
+        assertEquals("DATE_OF_BIRTH", 
translator.resultColumns()[1].dataRowKey());
+        assertEquals("ARTIST_ID", translator.resultColumns()[2].dataRowKey());
 
         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].getDataRowKey());
-        assertEquals("PAINTING_DESCRIPTION", 
translator.resultColumns()[1].getDataRowKey());
-        assertEquals("PAINTING_TITLE", 
translator.resultColumns()[2].getDataRowKey());
-        assertEquals("ARTIST_ID", 
translator.resultColumns()[3].getDataRowKey());
-        assertEquals("GALLERY_ID", 
translator.resultColumns()[4].getDataRowKey());
-        assertEquals("PAINTING_ID", 
translator.resultColumns()[5].getDataRowKey());
-
-        assertEquals("toArtist.ARTIST_ID", 
translator.resultColumns()[6].getDataRowKey());
-        assertEquals("toArtist.DATE_OF_BIRTH", 
translator.resultColumns()[7].getDataRowKey());
-        assertEquals("toArtist.ARTIST_NAME", 
translator.resultColumns()[8].getDataRowKey());
+        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());
 
         assertTrue(translator.hasJoins());
         assertFalse(translator.suppressingDistinct());
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/query/ProcedureCallIT.java 
b/cayenne/src/test/java/org/apache/cayenne/query/ProcedureCallIT.java
index d73a0c1ba..5d85e1439 100644
--- a/cayenne/src/test/java/org/apache/cayenne/query/ProcedureCallIT.java
+++ b/cayenne/src/test/java/org/apache/cayenne/query/ProcedureCallIT.java
@@ -21,6 +21,7 @@ package org.apache.cayenne.query;
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.ProcedureResult;
 import org.apache.cayenne.access.jdbc.ColumnDescriptor;
+import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.log.NoopJdbcEventLogger;
 import org.apache.cayenne.testdo.testmap.Artist;
 import org.apache.cayenne.testdo.testmap.Painting;
@@ -242,9 +243,9 @@ public class ProcedureCallIT {
         ColumnDescriptor[] columns = new ColumnDescriptor[3];
 
         // read ID as Long, and everything else as default types
-        columns[0] = new ColumnDescriptor("ARTIST_ID", Types.BIGINT);
-        columns[1] = new ColumnDescriptor("ARTIST_NAME", Types.CHAR);
-        columns[2] = new ColumnDescriptor("DATE_OF_BIRTH", Types.DATE);
+        columns[0] = new ColumnDescriptor("ARTIST_ID", "ARTIST_ID", 
Types.BIGINT, TypesMapping.getJavaBySqlType(Types.BIGINT), null);
+        columns[1] = new ColumnDescriptor("ARTIST_NAME", "ARTIST_NAME", 
Types.CHAR, TypesMapping.getJavaBySqlType(Types.CHAR), null);
+        columns[2] = new ColumnDescriptor("DATE_OF_BIRTH", "DATE_OF_BIRTH", 
Types.DATE, TypesMapping.getJavaBySqlType(Types.DATE), null);
 
         List<?> rows = 
runProcedureSelect(ProcedureCall.dataRowQuery(SELECT_STORED_PROCEDURE)
                 .param("aName", "An Artist")

Reply via email to