From 7f068874bbc0dc071e3c982650beca92d0900479 Mon Sep 17 00:00:00 2001 From: ShenFeng312 Date: Fri, 14 Mar 2025 10:15:40 +0800 Subject: [PATCH 1/2] Use force-quoting in R2dbcMappingContext by default --- .../r2dbc/convert/MappingR2dbcConverter.java | 13 ++- .../DefaultReactiveDataAccessStrategy.java | 4 +- .../r2dbc/core/DefaultStatementMapper.java | 24 +++-- .../data/r2dbc/core/R2dbcEntityTemplate.java | 16 ++- .../data/r2dbc/core/StatementMapper.java | 3 + .../r2dbc/mapping/R2dbcMappingContext.java | 2 - .../data/r2dbc/query/QueryMapper.java | 22 +++- .../data/r2dbc/query/UpdateMapper.java | 2 +- .../repository/query/R2dbcQueryCreator.java | 16 ++- .../core/R2dbcEntityTemplateUnitTests.java | 4 +- ...ReactiveDataAccessStrategyTestSupport.java | 1 + .../ReactiveDeleteOperationUnitTests.java | 6 +- .../ReactiveInsertOperationUnitTests.java | 4 +- .../ReactiveSelectOperationUnitTests.java | 16 +-- .../ReactiveUpdateOperationUnitTests.java | 8 +- .../r2dbc/core/StatementMapperUnitTests.java | 2 +- .../query/PartTreeR2dbcQueryUnitTests.java | 100 +++++++++--------- .../query/R2dbcQueryMethodUnitTests.java | 2 +- ...SqlInspectingR2dbcRepositoryUnitTests.java | 2 +- .../core/mapping/DerivedSqlIdentifier.java | 1 + 20 files changed, 157 insertions(+), 91 deletions(-) diff --git a/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/convert/MappingR2dbcConverter.java b/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/convert/MappingR2dbcConverter.java index bf5f82b789..64fd17832a 100644 --- a/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/convert/MappingR2dbcConverter.java +++ b/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/convert/MappingR2dbcConverter.java @@ -44,6 +44,7 @@ import org.springframework.data.relational.core.mapping.RelationalMappingContext; import org.springframework.data.relational.core.mapping.RelationalPersistentEntity; import org.springframework.data.relational.core.mapping.RelationalPersistentProperty; +import org.springframework.data.relational.core.sql.SqlIdentifier; import org.springframework.data.relational.domain.RowDocument; import org.springframework.data.util.TypeInformation; import org.springframework.lang.Nullable; @@ -225,7 +226,10 @@ private void writeSimpleInternal(OutboundRow sink, Object value, boolean isNew, Object result = getPotentiallyConvertedSimpleWrite(value); - sink.put(property.getColumnName(), + SqlIdentifier columnName = property.getColumnName(); + + sink.put(SqlIdentifier.unquoted(columnName.getReference()), +// sink.put(property.getColumnName(), Parameter.fromOrEmpty(result, getPotentiallyConvertedSimpleNullType(property.getType()))); } @@ -244,7 +248,10 @@ private void writePropertyInternal(OutboundRow sink, Object value, boolean isNew } List collectionInternal = createCollection(asCollection(value), property); - sink.put(property.getColumnName(), Parameter.from(collectionInternal)); +// sink.put(property.getColumnName(), Parameter.from(collectionInternal)); + SqlIdentifier columnName = property.getColumnName(); +// + sink.put(SqlIdentifier.unquoted(columnName.getReference()), Parameter.from(collectionInternal)); return; } @@ -301,7 +308,7 @@ private List writeCollectionInternal(Collection source, @Nullable Typ private void writeNullInternal(OutboundRow sink, RelationalPersistentProperty property) { - sink.put(property.getColumnName(), Parameter.empty(getPotentiallyConvertedSimpleNullType(property.getType()))); + sink.put(property.getColumnName().getReference(), Parameter.empty(getPotentiallyConvertedSimpleNullType(property.getType()))); } private Class getPotentiallyConvertedSimpleNullType(Class type) { diff --git a/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/DefaultReactiveDataAccessStrategy.java b/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/DefaultReactiveDataAccessStrategy.java index d655464e82..a2eacbfd15 100644 --- a/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/DefaultReactiveDataAccessStrategy.java +++ b/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/DefaultReactiveDataAccessStrategy.java @@ -181,11 +181,11 @@ public OutboundRow getOutboundRow(Object object) { for (RelationalPersistentProperty property : entity) { - Parameter value = row.get(property.getColumnName()); + Parameter value = row.get(property.getColumnName().getReference()); if (value != null && shouldConvertArrayValue(property, value)) { Parameter writeValue = getArrayValue(value, property); - row.put(property.getColumnName(), writeValue); + row.put(property.getColumnName().getReference(), writeValue); } } diff --git a/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/DefaultStatementMapper.java b/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/DefaultStatementMapper.java index a7fcf2a13e..cbdc288ae8 100644 --- a/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/DefaultStatementMapper.java +++ b/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/DefaultStatementMapper.java @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.List; +import org.jetbrains.annotations.NotNull; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.r2dbc.convert.R2dbcConverter; import org.springframework.data.r2dbc.dialect.R2dbcDialect; @@ -25,6 +26,7 @@ import org.springframework.data.r2dbc.query.BoundCondition; import org.springframework.data.r2dbc.query.UpdateMapper; import org.springframework.data.relational.core.dialect.RenderContextFactory; +import org.springframework.data.relational.core.mapping.RelationalMappingContext; import org.springframework.data.relational.core.mapping.RelationalPersistentEntity; import org.springframework.data.relational.core.mapping.RelationalPersistentProperty; import org.springframework.data.relational.core.query.CriteriaDefinition; @@ -53,7 +55,7 @@ class DefaultStatementMapper implements StatementMapper { private final RenderContext renderContext; private final UpdateMapper updateMapper; private final MappingContext, ? extends RelationalPersistentProperty> mappingContext; - + private boolean forceQuote; DefaultStatementMapper(R2dbcDialect dialect, R2dbcConverter converter) { RenderContextFactory factory = new RenderContextFactory(dialect); @@ -62,6 +64,9 @@ class DefaultStatementMapper implements StatementMapper { this.renderContext = factory.createRenderContext(); this.updateMapper = new UpdateMapper(dialect, converter); this.mappingContext = converter.getMappingContext(); + if(mappingContext instanceof RelationalMappingContext relationalMappingContext){ + forceQuote = relationalMappingContext.isForceQuote(); + } } DefaultStatementMapper(R2dbcDialect dialect, RenderContext renderContext, UpdateMapper updateMapper, @@ -70,6 +75,9 @@ class DefaultStatementMapper implements StatementMapper { this.renderContext = renderContext; this.updateMapper = updateMapper; this.mappingContext = mappingContext; + if(mappingContext instanceof RelationalMappingContext relationalMappingContext){ + forceQuote = relationalMappingContext.isForceQuote(); + } } @Override @@ -90,7 +98,8 @@ public PreparedOperation getMappedObject(SelectSpec selectSpec) { private PreparedOperation