|
18 | 18 | import static org.assertj.core.api.Assertions.*;
|
19 | 19 | import static org.mockito.Mockito.*;
|
20 | 20 |
|
| 21 | +import io.r2dbc.spi.Parameters; |
21 | 22 | import io.r2dbc.spi.R2dbcType;
|
22 | 23 | import io.r2dbc.spi.test.MockColumnMetadata;
|
23 | 24 | import io.r2dbc.spi.test.MockResult;
|
|
36 | 37 | import org.junit.jupiter.api.BeforeEach;
|
37 | 38 | import org.junit.jupiter.api.Test;
|
38 | 39 | import org.springframework.beans.factory.ObjectFactory;
|
| 40 | +import org.springframework.core.convert.converter.Converter; |
39 | 41 | import org.springframework.data.annotation.CreatedDate;
|
40 | 42 | import org.springframework.data.annotation.Id;
|
41 | 43 | import org.springframework.data.annotation.LastModifiedDate;
|
|
44 | 46 | import org.springframework.data.domain.Sort;
|
45 | 47 | import org.springframework.data.mapping.callback.ReactiveEntityCallbacks;
|
46 | 48 | import org.springframework.data.mapping.context.PersistentEntities;
|
| 49 | +import org.springframework.data.r2dbc.convert.MappingR2dbcConverter; |
| 50 | +import org.springframework.data.r2dbc.convert.R2dbcCustomConversions; |
47 | 51 | import org.springframework.data.r2dbc.dialect.PostgresDialect;
|
48 | 52 | import org.springframework.data.r2dbc.mapping.OutboundRow;
|
| 53 | +import org.springframework.data.r2dbc.mapping.R2dbcMappingContext; |
49 | 54 | import org.springframework.data.r2dbc.mapping.event.AfterConvertCallback;
|
50 | 55 | import org.springframework.data.r2dbc.mapping.event.AfterSaveCallback;
|
51 | 56 | import org.springframework.data.r2dbc.mapping.event.BeforeConvertCallback;
|
@@ -83,7 +88,11 @@ void before() {
|
83 | 88 | recorder = StatementRecorder.newInstance();
|
84 | 89 | client = DatabaseClient.builder().connectionFactory(recorder)
|
85 | 90 | .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)); |
87 | 96 | }
|
88 | 97 |
|
89 | 98 | @Test // gh-220
|
@@ -540,6 +549,25 @@ void updateExcludesInsertOnlyColumns() {
|
540 | 549 | Parameter.from(23L));
|
541 | 550 | }
|
542 | 551 |
|
| 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 | + |
543 | 571 | @Value
|
544 | 572 | static class WithoutId {
|
545 | 573 |
|
@@ -687,4 +715,19 @@ public Mono<Person> onAfterConvert(Person entity, SqlIdentifier table) {
|
687 | 715 | return Mono.just(person);
|
688 | 716 | }
|
689 | 717 | }
|
| 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 | + } |
690 | 733 | }
|
0 commit comments