Skip to content

Commit d4a06a7

Browse files
committed
#87 - Consistently use RowMetadata.
We now apply row metadata checks also for property population.
1 parent 1c9595f commit d4a06a7

File tree

2 files changed

+35
-13
lines changed

2 files changed

+35
-13
lines changed

src/main/java/org/springframework/data/r2dbc/convert/MappingR2dbcConverter.java

+15-8
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import lombok.RequiredArgsConstructor;
2323

2424
import java.lang.reflect.Array;
25+
import java.util.Collection;
2526
import java.util.Collections;
2627
import java.util.LinkedHashMap;
2728
import java.util.Map;
@@ -117,7 +118,7 @@ public <R> R read(Class<R> type, Row row, @Nullable RowMetadata metadata) {
117118

118119
private <R> R read(RelationalPersistentEntity<R> entity, Row row, @Nullable RowMetadata metadata) {
119120

120-
R result = createInstance(row, "", entity);
121+
R result = createInstance(row, metadata, "", entity);
121122

122123
ConvertingPropertyAccessor<R> propertyAccessor = new ConvertingPropertyAccessor<>(
123124
entity.getPropertyAccessor(result), getConversionService());
@@ -208,7 +209,7 @@ private <S> S readEntityFrom(Row row, RowMetadata metadata, PersistentProperty<?
208209
return null;
209210
}
210211

211-
Object instance = createInstance(row, prefix, entity);
212+
Object instance = createInstance(row, metadata, prefix, entity);
212213

213214
PersistentPropertyAccessor<?> accessor = entity.getPropertyAccessor(instance);
214215
ConvertingPropertyAccessor<?> propertyAccessor = new ConvertingPropertyAccessor<>(accessor, getConversionService());
@@ -222,9 +223,11 @@ private <S> S readEntityFrom(Row row, RowMetadata metadata, PersistentProperty<?
222223
return (S) instance;
223224
}
224225

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) {
226228

227-
RowParameterValueProvider rowParameterValueProvider = new RowParameterValueProvider(row, entity, this, prefix);
229+
RowParameterValueProvider rowParameterValueProvider = new RowParameterValueProvider(row, rowMetadata, entity, this,
230+
prefix);
228231

229232
return createInstance(entity, rowParameterValueProvider::getParameterValue);
230233
}
@@ -393,16 +396,16 @@ public <T> BiFunction<Row, RowMetadata, T> populateIdIfNecessary(T object) {
393396
private boolean potentiallySetId(Row row, RowMetadata metadata, PersistentPropertyAccessor<?> propertyAccessor,
394397
RelationalPersistentProperty idProperty) {
395398

396-
Map<String, ColumnMetadata> columns = createMetadataMap(metadata);
399+
Collection<String> columns = metadata.getColumnNames();
397400
Object generatedIdValue = null;
398401

399-
if (columns.containsKey(idProperty.getColumnName())) {
402+
if (columns.contains(idProperty.getColumnName())) {
400403
generatedIdValue = row.get(idProperty.getColumnName());
401404
}
402405

403406
if (columns.size() == 1) {
404407

405-
String key = columns.keySet().iterator().next();
408+
String key = columns.iterator().next();
406409
generatedIdValue = row.get(key);
407410
}
408411

@@ -416,7 +419,6 @@ private boolean potentiallySetId(Row row, RowMetadata metadata, PersistentProper
416419
return true;
417420
}
418421

419-
@SuppressWarnings("unchecked")
420422
private <R> RelationalPersistentEntity<R> getRequiredPersistentEntity(Class<R> type) {
421423
return (RelationalPersistentEntity<R>) getMappingContext().getRequiredPersistentEntity(type);
422424
}
@@ -436,6 +438,7 @@ private static Map<String, ColumnMetadata> createMetadataMap(RowMetadata metadat
436438
private static class RowParameterValueProvider implements ParameterValueProvider<RelationalPersistentProperty> {
437439

438440
private final @NonNull Row resultSet;
441+
private final @Nullable RowMetadata metadata;
439442
private final @NonNull RelationalPersistentEntity<?> entity;
440443
private final @NonNull RelationalConverter converter;
441444
private final @NonNull String prefix;
@@ -453,6 +456,10 @@ public <T> T getParameterValue(Parameter<T, RelationalPersistentProperty> parame
453456

454457
try {
455458

459+
if (metadata != null && !metadata.getColumnNames().contains(column)) {
460+
return null;
461+
}
462+
456463
Object value = resultSet.get(column);
457464

458465
if (value == null) {

src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java

+20-5
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@
1919

2020
import io.r2dbc.spi.ConnectionFactory;
2121
import lombok.AllArgsConstructor;
22-
import lombok.Data;
22+
import lombok.Getter;
2323
import lombok.NoArgsConstructor;
24+
import lombok.Setter;
2425
import reactor.core.publisher.Flux;
2526
import reactor.core.publisher.Mono;
2627
import reactor.test.StepVerifier;
@@ -37,6 +38,7 @@
3738
import org.springframework.beans.factory.annotation.Autowired;
3839
import org.springframework.dao.DataAccessException;
3940
import org.springframework.data.annotation.Id;
41+
import org.springframework.data.annotation.PersistenceConstructor;
4042
import org.springframework.data.r2dbc.convert.MappingR2dbcConverter;
4143
import org.springframework.data.r2dbc.core.DefaultReactiveDataAccessStrategy;
4244
import org.springframework.data.r2dbc.core.TransactionalDatabaseClient;
@@ -210,14 +212,27 @@ interface LegoSetRepository extends ReactiveCrudRepository<LegoSet, Integer> {
210212
Flux<Integer> findAllIds();
211213
}
212214

213-
@Data
215+
@Getter
216+
@Setter
214217
@Table("legoset")
215-
@AllArgsConstructor
216218
@NoArgsConstructor
217-
static class LegoSet {
218-
@Id Integer id;
219+
static class LegoSet extends Lego {
219220
String name;
220221
Integer manual;
222+
223+
@PersistenceConstructor
224+
public LegoSet(Integer id, String name, Integer manual) {
225+
super(id);
226+
this.name = name;
227+
this.manual = manual;
228+
}
229+
}
230+
231+
@AllArgsConstructor
232+
@NoArgsConstructor
233+
@Getter
234+
static class Lego {
235+
@Id Integer id;
221236
}
222237

223238
interface Named {

0 commit comments

Comments
 (0)