diff --git a/pom.xml b/pom.xml index ad15c2b9..40719da0 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-r2dbc - 1.5.0-SNAPSHOT + 1.5.0-698-SNAPSHOT Spring Data R2DBC Spring Data module for R2DBC diff --git a/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java b/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java index cec79ee3..6d18a72b 100644 --- a/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java +++ b/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java @@ -21,7 +21,6 @@ import java.util.List; import java.util.Map; import java.util.regex.Pattern; - import org.springframework.data.domain.Sort; import org.springframework.data.mapping.MappingException; import org.springframework.data.mapping.PersistentPropertyPath; @@ -81,8 +80,7 @@ public QueryMapper(R2dbcDialect dialect, R2dbcConverter converter) { } /** - * Render a {@link SqlIdentifier} for SQL usage. - * The resulting String might contain quoting characters. + * Render a {@link SqlIdentifier} for SQL usage. The resulting String might contain quoting characters. * * @param identifier the identifier to be rendered. * @return an identifier String. @@ -473,11 +471,15 @@ private Condition createCondition(Column column, @Nullable Object mappedValue, C } if (comparator == Comparator.IS_TRUE) { - return column.isEqualTo(SQL.literalOf(true)); + Expression bind = booleanBind(column, mappedValue, valueType, bindings, ignoreCase); + + return column.isEqualTo(bind); } if (comparator == Comparator.IS_FALSE) { - return column.isEqualTo(SQL.literalOf(false)); + Expression bind = booleanBind(column, mappedValue, valueType, bindings, ignoreCase); + + return column.isEqualTo(bind); } Expression columnExpression = column; @@ -627,6 +629,13 @@ private Expression bind(@Nullable Object mappedValue, Class valueType, Mutabl : SQL.bindMarker(bindMarker.getPlaceholder()); } + private Expression booleanBind(Column column, Object mappedValue, Class valueType, MutableBindings bindings, + boolean ignoreCase) { + BindMarker bindMarker = bindings.nextMarker(column.getName().getReference()); + + return bind(mappedValue, valueType, bindings, bindMarker, ignoreCase); + } + /** * Value object to represent a field and its meta-information. */ @@ -750,7 +759,9 @@ private boolean isPathToJavaLangClassProperty(PropertyPath path) { /* * (non-Javadoc) - * @see org.springframework.data.r2dbc.core.convert.QueryMapper.Field#getTypeHint() + * + * @see + * org.springframework.data.r2dbc.core.convert.QueryMapper.Field#getTypeHint() */ @Override public TypeInformation getTypeHint() { 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 51feffbf..9a5d39c3 100644 --- a/src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java +++ b/src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java @@ -106,8 +106,8 @@ void before() { @Test void shouldInsertNewItems() { - LegoSet legoSet1 = new LegoSet(null, "SCHAUFELRADBAGGER", 12); - LegoSet legoSet2 = new LegoSet(null, "FORSCHUNGSSCHIFF", 13); + LegoSet legoSet1 = new LegoSet(null, "SCHAUFELRADBAGGER", 12, true); + LegoSet legoSet2 = new LegoSet(null, "FORSCHUNGSSCHIFF", 13, false); repository.saveAll(Arrays.asList(legoSet1, legoSet2)) // .as(StepVerifier::create) // @@ -181,8 +181,8 @@ void shouldByStringQueryApplyingDtoProjection() { @Test // gh-344 void shouldFindApplyingDistinctProjection() { - LegoSet legoSet1 = new LegoSet(null, "SCHAUFELRADBAGGER", 12); - LegoSet legoSet2 = new LegoSet(null, "SCHAUFELRADBAGGER", 13); + LegoSet legoSet1 = new LegoSet(null, "SCHAUFELRADBAGGER", 12, true); + LegoSet legoSet2 = new LegoSet(null, "SCHAUFELRADBAGGER", 13, false); repository.saveAll(Arrays.asList(legoSet1, legoSet2)) // .as(StepVerifier::create) // @@ -211,6 +211,19 @@ void shouldFindApplyingSimpleTypeProjection() { }).verifyComplete(); } + @Test // gh-698 + void shouldBeTrue() { + shouldInsertNewItems(); + + repository.findLegoSetByFlag(true) // + .map(a -> a.flag) // + .collectList() // + .as(StepVerifier::create) // + .consumeNextWith(actual -> { + assertThat(actual).hasSize(1).contains(true); + }).verifyComplete(); + } + @Test void shouldDeleteUsingQueryMethod() { @@ -256,9 +269,8 @@ void shouldFindByPageable() { @Test // gh-335 void shouldFindTop10() { - Flux sets = Flux.fromStream(IntStream.range(0, 100).mapToObj(value -> { - return new LegoSet(null, "Set " + value, value); - })); + Flux sets = Flux + .fromStream(IntStream.range(0, 100).mapToObj(value -> new LegoSet(null, "Set " + value, value, true))); repository.saveAll(sets) // .as(StepVerifier::create) // @@ -291,8 +303,8 @@ public void shouldInsertItemsTransactional() { R2dbcTransactionManager r2dbcTransactionManager = new R2dbcTransactionManager(connectionFactory); TransactionalOperator rxtx = TransactionalOperator.create(r2dbcTransactionManager); - LegoSet legoSet1 = new LegoSet(null, "SCHAUFELRADBAGGER", 12); - LegoSet legoSet2 = new LegoSet(null, "FORSCHUNGSSCHIFF", 13); + LegoSet legoSet1 = new LegoSet(null, "SCHAUFELRADBAGGER", 12, true); + LegoSet legoSet2 = new LegoSet(null, "FORSCHUNGSSCHIFF", 13, false); Mono> transactional = repository.save(legoSet1) // .map(it -> jdbc.queryForMap("SELECT count(*) AS count FROM legoset")).as(rxtx::transactional); @@ -407,6 +419,8 @@ interface LegoSetRepository extends ReactiveCrudRepository { Mono countByNameContains(String namePart); Mono existsByName(String name); + + Flux findLegoSetByFlag(boolean flag); } public interface Buildable { @@ -421,6 +435,7 @@ public interface Buildable { public static class LegoSet extends Lego implements Buildable { String name; Integer manual; + boolean flag; @PersistenceConstructor LegoSet(Integer id, String name, Integer manual) { @@ -428,6 +443,12 @@ public static class LegoSet extends Lego implements Buildable { this.name = name; this.manual = manual; } + + @PersistenceConstructor + LegoSet(Integer id, String name, Integer manual, Boolean flag) { + this(id, name, manual); + this.flag = flag; + } } @AllArgsConstructor diff --git a/src/test/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQueryUnitTests.java b/src/test/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQueryUnitTests.java index 6144c5fd..34645122 100644 --- a/src/test/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQueryUnitTests.java +++ b/src/test/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQueryUnitTests.java @@ -486,7 +486,7 @@ void createsQueryToFindAllEntitiesByIntegerAttributeNotIn() throws Exception { .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age NOT IN ($1)"); } - @Test // gh-282 + @Test // gh-282, gh-698 void createsQueryToFindAllEntitiesByBooleanAttributeTrue() throws Exception { R2dbcQueryMethod queryMethod = getQueryMethod("findAllByActiveTrue"); @@ -496,10 +496,10 @@ void createsQueryToFindAllEntitiesByBooleanAttributeTrue() throws Exception { PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".active = TRUE"); + .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".active = $1"); } - @Test // gh-282 + @Test // gh-282, gh-698 void createsQueryToFindAllEntitiesByBooleanAttributeFalse() throws Exception { R2dbcQueryMethod queryMethod = getQueryMethod("findAllByActiveFalse"); @@ -509,7 +509,7 @@ void createsQueryToFindAllEntitiesByBooleanAttributeFalse() throws Exception { PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".active = FALSE"); + .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".active = $1"); } @Test // gh-282 diff --git a/src/test/java/org/springframework/data/r2dbc/testing/H2TestSupport.java b/src/test/java/org/springframework/data/r2dbc/testing/H2TestSupport.java index a09ec752..ca3834f0 100644 --- a/src/test/java/org/springframework/data/r2dbc/testing/H2TestSupport.java +++ b/src/test/java/org/springframework/data/r2dbc/testing/H2TestSupport.java @@ -45,6 +45,7 @@ public class H2TestSupport { + " version integer NULL,\n" // + " name varchar(255) NOT NULL,\n" // + " extra varchar(255),\n" // + + " flag boolean,\n" // + " manual integer NULL\n" // + ");"; diff --git a/src/test/java/org/springframework/data/r2dbc/testing/MariaDbTestSupport.java b/src/test/java/org/springframework/data/r2dbc/testing/MariaDbTestSupport.java index 8c93204b..4cb9157c 100644 --- a/src/test/java/org/springframework/data/r2dbc/testing/MariaDbTestSupport.java +++ b/src/test/java/org/springframework/data/r2dbc/testing/MariaDbTestSupport.java @@ -51,6 +51,7 @@ public class MariaDbTestSupport { public static final String CREATE_TABLE_LEGOSET_WITH_ID_GENERATION = "CREATE TABLE legoset (\n" // + " id integer AUTO_INCREMENT PRIMARY KEY,\n" // + " name varchar(255) NOT NULL,\n" // + + " flag boolean NOT NULL,\n" // + " manual integer NULL\n" // + ") ENGINE=InnoDB;"; diff --git a/src/test/java/org/springframework/data/r2dbc/testing/MySqlTestSupport.java b/src/test/java/org/springframework/data/r2dbc/testing/MySqlTestSupport.java index 7a1937c4..24896d98 100644 --- a/src/test/java/org/springframework/data/r2dbc/testing/MySqlTestSupport.java +++ b/src/test/java/org/springframework/data/r2dbc/testing/MySqlTestSupport.java @@ -53,6 +53,7 @@ public class MySqlTestSupport { + " id integer AUTO_INCREMENT PRIMARY KEY,\n" // + " version integer NULL,\n" // + " name varchar(255) NOT NULL,\n" // + + " flag boolean NULL,\n" // + " manual integer NULL\n" // + ") ENGINE=InnoDB;"; diff --git a/src/test/java/org/springframework/data/r2dbc/testing/OracleTestSupport.java b/src/test/java/org/springframework/data/r2dbc/testing/OracleTestSupport.java index f7ef83dc..f53d0c2e 100644 --- a/src/test/java/org/springframework/data/r2dbc/testing/OracleTestSupport.java +++ b/src/test/java/org/springframework/data/r2dbc/testing/OracleTestSupport.java @@ -55,6 +55,7 @@ public class OracleTestSupport { + " id INTEGER GENERATED by default on null as IDENTITY PRIMARY KEY,\n" // + " version INTEGER NULL,\n" // + " name VARCHAR2(255) NOT NULL,\n" // + + " flag Boolean NULL,\n" // + " manual INTEGER NULL\n" // + ")"; diff --git a/src/test/java/org/springframework/data/r2dbc/testing/PostgresTestSupport.java b/src/test/java/org/springframework/data/r2dbc/testing/PostgresTestSupport.java index b8c26e93..9357a94e 100644 --- a/src/test/java/org/springframework/data/r2dbc/testing/PostgresTestSupport.java +++ b/src/test/java/org/springframework/data/r2dbc/testing/PostgresTestSupport.java @@ -28,7 +28,8 @@ public class PostgresTestSupport { + " id integer CONSTRAINT id1 PRIMARY KEY,\n" // + " version integer NULL,\n" // + " name varchar(255) NOT NULL,\n" // - + " manual integer NULL\n," // + + " manual integer NULL,\n" // + + " flag boolean NULL,\n" // + " cert bytea NULL\n" // + ");"; diff --git a/src/test/java/org/springframework/data/r2dbc/testing/SqlServerTestSupport.java b/src/test/java/org/springframework/data/r2dbc/testing/SqlServerTestSupport.java index 5fd65ed3..39870579 100644 --- a/src/test/java/org/springframework/data/r2dbc/testing/SqlServerTestSupport.java +++ b/src/test/java/org/springframework/data/r2dbc/testing/SqlServerTestSupport.java @@ -28,6 +28,7 @@ public class SqlServerTestSupport { + " id integer IDENTITY(1,1) PRIMARY KEY,\n" // + " version integer NULL,\n" // + " name varchar(255) NOT NULL,\n" // + + " flag bit NULL\n," // + " extra varchar(255),\n" // + " manual integer NULL\n" // + ");";