|
35 | 35 | import org.springframework.data.mapping.PreferredConstructor;
|
36 | 36 | import org.springframework.data.mapping.context.MappingContext;
|
37 | 37 | import org.springframework.data.mapping.model.ConvertingPropertyAccessor;
|
| 38 | +import org.springframework.data.mapping.model.DefaultSpELExpressionEvaluator; |
38 | 39 | import org.springframework.data.mapping.model.ParameterValueProvider;
|
| 40 | +import org.springframework.data.mapping.model.SpELContext; |
| 41 | +import org.springframework.data.mapping.model.SpELExpressionEvaluator; |
| 42 | +import org.springframework.data.mapping.model.SpELExpressionParameterValueProvider; |
39 | 43 | import org.springframework.data.r2dbc.mapping.OutboundRow;
|
40 | 44 | import org.springframework.data.r2dbc.support.ArrayUtils;
|
41 | 45 | import org.springframework.data.relational.core.conversion.BasicRelationalConverter;
|
@@ -294,10 +298,20 @@ private <S> S readEntityFrom(Row row, RowMetadata metadata, PersistentProperty<?
|
294 | 298 | private <S> S createInstance(Row row, @Nullable RowMetadata rowMetadata, String prefix,
|
295 | 299 | RelationalPersistentEntity<S> entity) {
|
296 | 300 |
|
297 |
| - RowParameterValueProvider rowParameterValueProvider = new RowParameterValueProvider(row, rowMetadata, entity, this, |
298 |
| - prefix); |
| 301 | + PreferredConstructor<S, RelationalPersistentProperty> persistenceConstructor = entity.getPersistenceConstructor(); |
| 302 | + ParameterValueProvider<RelationalPersistentProperty> provider; |
299 | 303 |
|
300 |
| - return createInstance(entity, rowParameterValueProvider::getParameterValue); |
| 304 | + if (persistenceConstructor != null && persistenceConstructor.hasParameters()) { |
| 305 | + |
| 306 | + SpELContext spELContext = new SpELContext(new RowPropertyAccessor(rowMetadata)); |
| 307 | + SpELExpressionEvaluator expressionEvaluator = new DefaultSpELExpressionEvaluator(row, spELContext); |
| 308 | + provider = new SpELExpressionParameterValueProvider<>(expressionEvaluator, getConversionService(), |
| 309 | + new RowParameterValueProvider(row, rowMetadata, entity, this, prefix)); |
| 310 | + } else { |
| 311 | + provider = NoOpParameterValueProvider.INSTANCE; |
| 312 | + } |
| 313 | + |
| 314 | + return createInstance(entity, provider::getParameterValue); |
301 | 315 | }
|
302 | 316 |
|
303 | 317 | // ----------------------------------
|
@@ -381,7 +395,7 @@ private boolean shouldSkipIdValue(@Nullable Object value, RelationalPersistentPr
|
381 | 395 | return value == null;
|
382 | 396 | }
|
383 | 397 |
|
384 |
| - if (Number.class.isInstance(value)) { |
| 398 | + if (value instanceof Number) { |
385 | 399 | return ((Number) value).longValue() == 0L;
|
386 | 400 | }
|
387 | 401 |
|
@@ -646,6 +660,16 @@ private static Collection<?> asCollection(Object source) {
|
646 | 660 | return source.getClass().isArray() ? CollectionUtils.arrayToList(source) : Collections.singleton(source);
|
647 | 661 | }
|
648 | 662 |
|
| 663 | + enum NoOpParameterValueProvider implements ParameterValueProvider<RelationalPersistentProperty> { |
| 664 | + |
| 665 | + INSTANCE; |
| 666 | + |
| 667 | + @Override |
| 668 | + public <T> T getParameterValue(PreferredConstructor.Parameter<T, RelationalPersistentProperty> parameter) { |
| 669 | + return null; |
| 670 | + } |
| 671 | + } |
| 672 | + |
649 | 673 | private static class RowParameterValueProvider implements ParameterValueProvider<RelationalPersistentProperty> {
|
650 | 674 |
|
651 | 675 | private final Row resultSet;
|
|
0 commit comments