Skip to content

Commit 28a4201

Browse files
committed
Refactor unknown column handling and improve safety checks
1 parent 381f5a4 commit 28a4201

File tree

5 files changed

+37
-19
lines changed

5 files changed

+37
-19
lines changed

doma-core/src/main/java/org/seasar/doma/internal/jdbc/command/ColumnNameMapFormatter.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@
1616
package org.seasar.doma.internal.jdbc.command;
1717

1818
import java.util.Map;
19+
import java.util.Objects;
1920
import java.util.TreeMap;
2021

21-
public class ColumnNameMapFormatter {
22-
public static String format(Map<String, MappingSupport.PropType> columnNameMap) {
22+
class ColumnNameMapFormatter {
23+
static String format(Map<String, MappingSupport.PropType> columnNameMap) {
24+
Objects.requireNonNull(columnNameMap);
25+
2326
StringBuilder buf = new StringBuilder();
2427
buf.append("------------------------------------------------------\n");
2528
buf.append("Lowercase Column Name -> Property Name (Entity Name)\n");

doma-core/src/main/java/org/seasar/doma/internal/jdbc/command/MappingSupport.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,11 @@ public Map<Integer, MappingSupport.PropType> createIndexMap(
9898
if (ROWNUMBER_COLUMN_NAME.equals(lowerCaseColumnName)) {
9999
continue;
100100
}
101-
unknownColumnHandler.handle(query, entityType, lowerCaseColumnName, columnNameMap);
101+
unknownColumnHandler.handle(
102+
query,
103+
entityType,
104+
lowerCaseColumnName,
105+
() -> ColumnNameMapFormatter.format(columnNameMap));
102106
} else {
103107
unmappedPropertySet.remove(propertyType);
104108
indexMap.put(i, propertyType);
@@ -159,6 +163,13 @@ private void throwResultMappingException(Set<PropType> unmappedPropertySet) {
159163
*/
160164
public record PropType(
161165
EntityType<?> entityType, EntityPropertyType<?, ?> propertyType, String propertyPath) {
166+
167+
public PropType {
168+
Objects.requireNonNull(entityType);
169+
Objects.requireNonNull(propertyType);
170+
Objects.requireNonNull(propertyPath);
171+
}
172+
162173
public String name() {
163174
return propertyType.getName();
164175
}
@@ -180,6 +191,11 @@ public String columnName(BiFunction<NamingType, String, String> namingFunction)
180191
*/
181192
public record Prop(PropType propType, Property<Object, ?> property, Object rawValue) {
182193

194+
public Prop {
195+
Objects.requireNonNull(propType);
196+
Objects.requireNonNull(property);
197+
}
198+
183199
public EntityType<?> entityType() {
184200
return propType.entityType();
185201
}

doma-core/src/main/java/org/seasar/doma/jdbc/UnknownColumnHandler.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@
1515
*/
1616
package org.seasar.doma.jdbc;
1717

18-
import java.util.Map;
19-
import org.seasar.doma.internal.jdbc.command.ColumnNameMapFormatter;
20-
import org.seasar.doma.internal.jdbc.command.MappingSupport;
18+
import java.util.function.Supplier;
2119
import org.seasar.doma.jdbc.entity.EntityType;
2220
import org.seasar.doma.jdbc.entity.NamingType;
2321
import org.seasar.doma.jdbc.query.Query;
@@ -50,24 +48,25 @@ default void handle(Query query, EntityType<?> entityType, String unknownColumnN
5048
}
5149

5250
/**
53-
* Handles the unknown column with additional context provided by the column name map.
51+
* Handles an unknown column during query execution. Provides additional information for the
52+
* exception when the column is unrecognized by the entity.
5453
*
55-
* @param query the query associated with the operation
56-
* @param entityType the entity type description
57-
* @param unknownColumnName the name of the unknown column
58-
* @param columnNameMap the map containing column names and their corresponding property types
59-
* @throws UnknownColumnAdditionalInfoException if handling the unknown column fails with
60-
* additional information
54+
* @param query the query being executed
55+
* @param entityType the entity type containing the metadata about the entity
56+
* @param unknownColumnName the name of the column that is unknown
57+
* @param informationSupplier the supplier that provides additional information about the unknown
58+
* column
59+
* @throws UnknownColumnAdditionalInfoException if the unknown column cannot be handled
6160
*/
6261
default void handle(
6362
Query query,
6463
EntityType<?> entityType,
6564
String unknownColumnName,
66-
Map<String, MappingSupport.PropType> columnNameMap) {
65+
Supplier<String> informationSupplier) {
6766
try {
6867
handle(query, entityType, unknownColumnName);
6968
} catch (UnknownColumnException original) {
70-
String additionalInfo = ColumnNameMapFormatter.format(columnNameMap);
69+
String additionalInfo = informationSupplier.get();
7170
UnknownColumnAdditionalInfoException ex =
7271
new UnknownColumnAdditionalInfoException(
7372
query.getConfig().getExceptionSqlLogType(), original, additionalInfo);

doma-core/src/main/java/org/seasar/doma/message/Message.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ public enum Message implements MessageResource {
280280
DOMA2238(
281281
"""
282282
While the column "{0}" is in the result set, the corresponding property is not found in the entity class "{1}".
283-
Check the following mapping table:
283+
Check the following mapping information:
284284
{4}
285285
PATH=[{2}]
286286
SQL=[{3}]"""),

doma-core/src/test/java/org/seasar/doma/internal/jdbc/command/EntityProviderTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import java.math.BigDecimal;
2626
import java.sql.SQLException;
2727
import java.util.Collections;
28-
import java.util.Map;
28+
import java.util.function.Supplier;
2929
import org.junit.jupiter.api.Test;
3030
import org.seasar.doma.FetchType;
3131
import org.seasar.doma.internal.jdbc.mock.ColumnMetaData;
@@ -140,7 +140,7 @@ public void testCreateIndexMap_WithDuplicateColumnName() throws SQLException {
140140
}
141141

142142
@Test
143-
public void testCreateIndexMap_DuplicateColumnHandler() throws SQLException {
143+
public void testCreateIndexMap_DuplicateColumnHandler() {
144144
MockResultSetMetaData metaData = new MockResultSetMetaData();
145145
metaData.columns.add(new ColumnMetaData("id"));
146146
metaData.columns.add(new ColumnMetaData("name"));
@@ -254,7 +254,7 @@ public void handle(
254254
Query query,
255255
EntityType<?> entityType,
256256
String unknownColumnName,
257-
Map<String, MappingSupport.PropType> columnNameMap) {}
257+
Supplier<String> informationSupplier) {}
258258
}
259259

260260
protected static class EmptyUnknownColumnHandlerConfig extends MockConfig {

0 commit comments

Comments
 (0)