22
22
import lombok .RequiredArgsConstructor ;
23
23
24
24
import java .lang .reflect .Array ;
25
+ import java .util .Collection ;
25
26
import java .util .Collections ;
26
27
import java .util .LinkedHashMap ;
27
28
import java .util .Map ;
@@ -117,7 +118,7 @@ public <R> R read(Class<R> type, Row row, @Nullable RowMetadata metadata) {
117
118
118
119
private <R > R read (RelationalPersistentEntity <R > entity , Row row , @ Nullable RowMetadata metadata ) {
119
120
120
- R result = createInstance (row , "" , entity );
121
+ R result = createInstance (row , metadata , "" , entity );
121
122
122
123
ConvertingPropertyAccessor <R > propertyAccessor = new ConvertingPropertyAccessor <>(
123
124
entity .getPropertyAccessor (result ), getConversionService ());
@@ -208,7 +209,7 @@ private <S> S readEntityFrom(Row row, RowMetadata metadata, PersistentProperty<?
208
209
return null ;
209
210
}
210
211
211
- Object instance = createInstance (row , prefix , entity );
212
+ Object instance = createInstance (row , metadata , prefix , entity );
212
213
213
214
PersistentPropertyAccessor <?> accessor = entity .getPropertyAccessor (instance );
214
215
ConvertingPropertyAccessor <?> propertyAccessor = new ConvertingPropertyAccessor <>(accessor , getConversionService ());
@@ -222,9 +223,11 @@ private <S> S readEntityFrom(Row row, RowMetadata metadata, PersistentProperty<?
222
223
return (S ) instance ;
223
224
}
224
225
225
- private <S > S createInstance (Row row , String prefix , RelationalPersistentEntity <S > entity ) {
226
+ private <S > S createInstance (Row row , @ Nullable RowMetadata rowMetadata , String prefix ,
227
+ RelationalPersistentEntity <S > entity ) {
226
228
227
- RowParameterValueProvider rowParameterValueProvider = new RowParameterValueProvider (row , entity , this , prefix );
229
+ RowParameterValueProvider rowParameterValueProvider = new RowParameterValueProvider (row , rowMetadata , entity , this ,
230
+ prefix );
228
231
229
232
return createInstance (entity , rowParameterValueProvider ::getParameterValue );
230
233
}
@@ -393,16 +396,16 @@ public <T> BiFunction<Row, RowMetadata, T> populateIdIfNecessary(T object) {
393
396
private boolean potentiallySetId (Row row , RowMetadata metadata , PersistentPropertyAccessor <?> propertyAccessor ,
394
397
RelationalPersistentProperty idProperty ) {
395
398
396
- Map <String , ColumnMetadata > columns = createMetadataMap ( metadata );
399
+ Collection <String > columns = metadata . getColumnNames ( );
397
400
Object generatedIdValue = null ;
398
401
399
- if (columns .containsKey (idProperty .getColumnName ())) {
402
+ if (columns .contains (idProperty .getColumnName ())) {
400
403
generatedIdValue = row .get (idProperty .getColumnName ());
401
404
}
402
405
403
406
if (columns .size () == 1 ) {
404
407
405
- String key = columns .keySet (). iterator ().next ();
408
+ String key = columns .iterator ().next ();
406
409
generatedIdValue = row .get (key );
407
410
}
408
411
@@ -416,7 +419,6 @@ private boolean potentiallySetId(Row row, RowMetadata metadata, PersistentProper
416
419
return true ;
417
420
}
418
421
419
- @ SuppressWarnings ("unchecked" )
420
422
private <R > RelationalPersistentEntity <R > getRequiredPersistentEntity (Class <R > type ) {
421
423
return (RelationalPersistentEntity <R >) getMappingContext ().getRequiredPersistentEntity (type );
422
424
}
@@ -436,6 +438,7 @@ private static Map<String, ColumnMetadata> createMetadataMap(RowMetadata metadat
436
438
private static class RowParameterValueProvider implements ParameterValueProvider <RelationalPersistentProperty > {
437
439
438
440
private final @ NonNull Row resultSet ;
441
+ private final @ Nullable RowMetadata metadata ;
439
442
private final @ NonNull RelationalPersistentEntity <?> entity ;
440
443
private final @ NonNull RelationalConverter converter ;
441
444
private final @ NonNull String prefix ;
@@ -453,6 +456,10 @@ public <T> T getParameterValue(Parameter<T, RelationalPersistentProperty> parame
453
456
454
457
try {
455
458
459
+ if (metadata != null && !metadata .getColumnNames ().contains (column )) {
460
+ return null ;
461
+ }
462
+
456
463
Object value = resultSet .get (column );
457
464
458
465
if (value == null ) {
0 commit comments