Skip to content

Commit 85ed436

Browse files
committed
Consider io.r2dbc.spi.Parameter as simple type.
We now consider R2DBC's Parameter as simple type to avoid entity handling. Closes #1696
1 parent 52fbdb0 commit 85ed436

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/mapping/R2dbcSimpleTypeHolder.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import io.r2dbc.spi.Blob;
1919
import io.r2dbc.spi.Clob;
20+
import io.r2dbc.spi.Parameter;
2021
import io.r2dbc.spi.Row;
2122

2223
import java.math.BigDecimal;
@@ -42,7 +43,7 @@ public class R2dbcSimpleTypeHolder extends SimpleTypeHolder {
4243
*/
4344
public static final Set<Class<?>> R2DBC_SIMPLE_TYPES = Collections
4445
.unmodifiableSet(new HashSet<>(Arrays.asList(OutboundRow.class, Row.class, BigInteger.class, BigDecimal.class,
45-
UUID.class, Blob.class, Clob.class, ByteBuffer.class)));
46+
UUID.class, Blob.class, Clob.class, ByteBuffer.class, Parameter.class)));
4647

4748
public static final SimpleTypeHolder HOLDER = new R2dbcSimpleTypeHolder();
4849

spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplateUnitTests.java

+44-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static org.assertj.core.api.Assertions.*;
1919
import static org.mockito.Mockito.*;
2020

21+
import io.r2dbc.spi.Parameters;
2122
import io.r2dbc.spi.R2dbcType;
2223
import io.r2dbc.spi.test.MockColumnMetadata;
2324
import io.r2dbc.spi.test.MockResult;
@@ -36,6 +37,7 @@
3637
import org.junit.jupiter.api.BeforeEach;
3738
import org.junit.jupiter.api.Test;
3839
import org.springframework.beans.factory.ObjectFactory;
40+
import org.springframework.core.convert.converter.Converter;
3941
import org.springframework.data.annotation.CreatedDate;
4042
import org.springframework.data.annotation.Id;
4143
import org.springframework.data.annotation.LastModifiedDate;
@@ -44,8 +46,11 @@
4446
import org.springframework.data.domain.Sort;
4547
import org.springframework.data.mapping.callback.ReactiveEntityCallbacks;
4648
import org.springframework.data.mapping.context.PersistentEntities;
49+
import org.springframework.data.r2dbc.convert.MappingR2dbcConverter;
50+
import org.springframework.data.r2dbc.convert.R2dbcCustomConversions;
4751
import org.springframework.data.r2dbc.dialect.PostgresDialect;
4852
import org.springframework.data.r2dbc.mapping.OutboundRow;
53+
import org.springframework.data.r2dbc.mapping.R2dbcMappingContext;
4954
import org.springframework.data.r2dbc.mapping.event.AfterConvertCallback;
5055
import org.springframework.data.r2dbc.mapping.event.AfterSaveCallback;
5156
import org.springframework.data.r2dbc.mapping.event.BeforeConvertCallback;
@@ -83,7 +88,11 @@ void before() {
8388
recorder = StatementRecorder.newInstance();
8489
client = DatabaseClient.builder().connectionFactory(recorder)
8590
.bindMarkers(PostgresDialect.INSTANCE.getBindMarkersFactory()).build();
86-
entityTemplate = new R2dbcEntityTemplate(client, PostgresDialect.INSTANCE);
91+
92+
R2dbcCustomConversions conversions = R2dbcCustomConversions.of(PostgresDialect.INSTANCE, new MoneyConverter());
93+
94+
entityTemplate = new R2dbcEntityTemplate(client, PostgresDialect.INSTANCE,
95+
new MappingR2dbcConverter(new R2dbcMappingContext(), conversions));
8796
}
8897

8998
@Test // gh-220
@@ -540,6 +549,25 @@ void updateExcludesInsertOnlyColumns() {
540549
Parameter.from(23L));
541550
}
542551

552+
@Test // GH-1696
553+
void shouldConsiderParameterConverter() {
554+
555+
MockRowMetadata metadata = MockRowMetadata.builder().build();
556+
MockResult result = MockResult.builder().rowMetadata(metadata).rowsUpdated(1).build();
557+
558+
recorder.addStubbing(s -> s.startsWith("INSERT"), result);
559+
560+
entityTemplate.insert(new WithMoney(null, new Money((byte) 1))).as(StepVerifier::create) //
561+
.expectNextCount(1) //
562+
.verifyComplete();
563+
564+
StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("INSERT"));
565+
566+
assertThat(statement.getSql()).isEqualTo("INSERT INTO with_money (money) VALUES ($1)");
567+
assertThat(statement.getBindings()).hasSize(1).containsEntry(0,
568+
Parameter.from(Parameters.in(R2dbcType.VARCHAR, "$$$")));
569+
}
570+
543571
@Value
544572
static class WithoutId {
545573

@@ -687,4 +715,19 @@ public Mono<Person> onAfterConvert(Person entity, SqlIdentifier table) {
687715
return Mono.just(person);
688716
}
689717
}
718+
719+
record WithMoney(@Id Integer id, Money money) {
720+
}
721+
722+
record Money(byte amount) {
723+
}
724+
725+
static class MoneyConverter implements Converter<Money, io.r2dbc.spi.Parameter> {
726+
727+
@Override
728+
public io.r2dbc.spi.Parameter convert(Money source) {
729+
return Parameters.in(R2dbcType.VARCHAR, "$$$");
730+
}
731+
732+
}
690733
}

0 commit comments

Comments
 (0)