From eb579695814aae561a324dfcccfbe1b896f037d3 Mon Sep 17 00:00:00 2001 From: Zsombor Gegesy Date: Mon, 22 Jun 2020 13:07:38 +0200 Subject: [PATCH] Insert should work without giving any explicit assignment/variables --- .../r2dbc/core/DefaultDatabaseClient.java | 4 --- .../r2dbc/core/DefaultStatementMapper.java | 4 --- .../core/DefaultDatabaseClientUnitTests.java | 16 +++++++++ ...stractR2dbcRepositoryIntegrationTests.java | 2 +- .../H2R2dbcRepositoryIntegrationTests.java | 35 ++++++++++++++++++- 5 files changed, 51 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/springframework/data/r2dbc/core/DefaultDatabaseClient.java b/src/main/java/org/springframework/data/r2dbc/core/DefaultDatabaseClient.java index 25f56529..194d9941 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/DefaultDatabaseClient.java +++ b/src/main/java/org/springframework/data/r2dbc/core/DefaultDatabaseClient.java @@ -1044,10 +1044,6 @@ public Mono then() { private FetchSpec exchange(BiFunction mappingFunction) { - if (this.byName.isEmpty()) { - throw new IllegalStateException("Insert fields is empty!"); - } - StatementMapper mapper = dataAccessStrategy.getStatementMapper(); StatementMapper.InsertSpec insert = mapper.createInsert(this.table); diff --git a/src/main/java/org/springframework/data/r2dbc/core/DefaultStatementMapper.java b/src/main/java/org/springframework/data/r2dbc/core/DefaultStatementMapper.java index 852618c1..fe481ed5 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/DefaultStatementMapper.java +++ b/src/main/java/org/springframework/data/r2dbc/core/DefaultStatementMapper.java @@ -159,10 +159,6 @@ private PreparedOperation getMappedObject(InsertSpec insertSpec, Bindings bindings; - if (boundAssignments.getAssignments().isEmpty()) { - throw new IllegalStateException("INSERT contains no values"); - } - bindings = boundAssignments.getBindings(); InsertBuilder.InsertIntoColumnsAndValues insertBuilder = StatementBuilder.insert(table); diff --git a/src/test/java/org/springframework/data/r2dbc/core/DefaultDatabaseClientUnitTests.java b/src/test/java/org/springframework/data/r2dbc/core/DefaultDatabaseClientUnitTests.java index 48108d3c..a29c2e36 100644 --- a/src/test/java/org/springframework/data/r2dbc/core/DefaultDatabaseClientUnitTests.java +++ b/src/test/java/org/springframework/data/r2dbc/core/DefaultDatabaseClientUnitTests.java @@ -249,6 +249,22 @@ public void insertShouldAcceptSettableValue() { verify(statement).bindNull(1, Integer.class); } + @Test + public void insertShouldWorkWithoutValues() { + + Statement statement = mockStatementFor("INSERT INTO id_only VALUES ()"); + DatabaseClient databaseClient = databaseClientBuilder.build(); + + databaseClient.insert().into("id_only") // + .then() // + .as(StepVerifier::create) // + .verifyComplete(); + + verify(statement).returnGeneratedValues(); + verify(statement).execute(); + verifyNoMoreInteractions(statement); + } + @Test // gh-128 public void executeShouldBindNamedValuesByIndex() { diff --git a/src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java b/src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java index be064ba7..ba08de06 100644 --- a/src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java +++ b/src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java @@ -61,7 +61,7 @@ public abstract class AbstractR2dbcRepositoryIntegrationTests extends R2dbcInteg @Autowired private LegoSetRepository repository; @Autowired private ConnectionFactory connectionFactory; - private JdbcTemplate jdbc; + protected JdbcTemplate jdbc; @Before public void before() { diff --git a/src/test/java/org/springframework/data/r2dbc/repository/H2R2dbcRepositoryIntegrationTests.java b/src/test/java/org/springframework/data/r2dbc/repository/H2R2dbcRepositoryIntegrationTests.java index f8c989a7..87e5942c 100644 --- a/src/test/java/org/springframework/data/r2dbc/repository/H2R2dbcRepositoryIntegrationTests.java +++ b/src/test/java/org/springframework/data/r2dbc/repository/H2R2dbcRepositoryIntegrationTests.java @@ -16,24 +16,33 @@ package org.springframework.data.r2dbc.repository; import io.r2dbc.spi.ConnectionFactory; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; +import java.util.Arrays; + import javax.sql.DataSource; import org.junit.Test; import org.junit.runner.RunWith; +import static org.assertj.core.api.Assertions.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; +import org.springframework.data.annotation.Id; import org.springframework.data.r2dbc.config.AbstractR2dbcConfiguration; import org.springframework.data.r2dbc.repository.config.EnableR2dbcRepositories; import org.springframework.data.r2dbc.repository.support.R2dbcRepositoryFactory; import org.springframework.data.r2dbc.testing.H2TestSupport; +import org.springframework.data.relational.core.mapping.Table; +import org.springframework.data.repository.reactive.ReactiveCrudRepository; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; @@ -47,10 +56,11 @@ public class H2R2dbcRepositoryIntegrationTests extends AbstractR2dbcRepositoryIntegrationTests { @Autowired private H2LegoSetRepository repository; + @Autowired private IdOnlyEntityRepository idOnlyEntityRepository; @Configuration @EnableR2dbcRepositories(considerNestedRepositories = true, - includeFilters = @Filter(classes = H2LegoSetRepository.class, type = FilterType.ASSIGNABLE_TYPE)) + includeFilters = @Filter(classes = {H2LegoSetRepository.class, IdOnlyEntityRepository.class}, type = FilterType.ASSIGNABLE_TYPE)) static class IntegrationTestConfiguration extends AbstractR2dbcConfiguration { @Bean @@ -60,6 +70,17 @@ public ConnectionFactory connectionFactory() { } } + interface IdOnlyEntityRepository extends ReactiveCrudRepository { + } + + @Getter + @Setter + @Table("id_only") + @NoArgsConstructor + static class IdOnlyEntity { + @Id Integer id; + } + @Override protected DataSource createDataSource() { return H2TestSupport.createDataSource(); @@ -112,6 +133,18 @@ public void shouldNotReturnUpdateCount() { repository.updateManualAndReturnNothing(42).as(StepVerifier::create).verifyComplete(); } + @Test + public void shouldInsertIdOnlyEntity() { + this.jdbc.execute("CREATE TABLE ID_ONLY(id serial CONSTRAINT id_only_pk PRIMARY KEY)"); + + IdOnlyEntity entity1 = new IdOnlyEntity(); + idOnlyEntityRepository.saveAll(Arrays.asList(entity1)) + .as(StepVerifier::create) // + .consumeNextWith( actual -> { + assertThat(actual.getId()).isNotNull(); + }).verifyComplete(); + } + interface H2LegoSetRepository extends LegoSetRepository { @Override