2626import org .springframework .data .domain .Sort ;
2727import org .springframework .data .r2dbc .convert .MappingR2dbcConverter ;
2828import org .springframework .data .r2dbc .convert .R2dbcConverter ;
29+ import org .springframework .data .r2dbc .convert .R2dbcCustomConversions ;
30+ import org .springframework .data .r2dbc .dialect .MySqlDialect ;
2931import org .springframework .data .r2dbc .dialect .PostgresDialect ;
32+ import org .springframework .data .r2dbc .dialect .R2dbcDialect ;
3033import org .springframework .data .r2dbc .mapping .R2dbcMappingContext ;
3134import org .springframework .data .relational .core .mapping .Column ;
3235import org .springframework .data .relational .core .query .Criteria ;
4548 */
4649class QueryMapperUnitTests {
4750
48- private R2dbcMappingContext context = new R2dbcMappingContext ();
49- private R2dbcConverter converter = new MappingR2dbcConverter (context );
50-
51- private QueryMapper mapper = new QueryMapper (PostgresDialect .INSTANCE , converter );
5251 private BindTarget bindTarget = mock (BindTarget .class );
52+ private QueryMapper mapper = createMapper (PostgresDialect .INSTANCE );
53+
54+ QueryMapper createMapper (R2dbcDialect dialect ) {
55+
56+ R2dbcCustomConversions conversions = R2dbcCustomConversions .of (dialect );
57+
58+ R2dbcMappingContext context = new R2dbcMappingContext ();
59+ context .setSimpleTypeHolder (conversions .getSimpleTypeHolder ());
60+ context .afterPropertiesSet ();
61+
62+ R2dbcConverter converter = new MappingR2dbcConverter (context , conversions );
63+
64+ return new QueryMapper (dialect , converter );
65+ }
5366
5467 @ Test // gh-289
5568 void shouldNotMapEmptyCriteria () {
@@ -189,7 +202,7 @@ void shouldMapExpression() {
189202 Table table = Table .create ("my_table" ).as ("my_aliased_table" );
190203
191204 Expression mappedObject = mapper .getMappedObject (table .column ("alternative" ).as ("my_aliased_col" ),
192- context .getRequiredPersistentEntity (Person .class ));
205+ mapper . getMappingContext () .getRequiredPersistentEntity (Person .class ));
193206
194207 assertThat (mappedObject ).hasToString ("my_aliased_table.another_name AS my_aliased_col" );
195208 }
@@ -200,7 +213,7 @@ void shouldMapCountFunction() {
200213 Table table = Table .create ("my_table" ).as ("my_aliased_table" );
201214
202215 Expression mappedObject = mapper .getMappedObject (Functions .count (table .column ("alternative" )),
203- context .getRequiredPersistentEntity (Person .class ));
216+ mapper . getMappingContext () .getRequiredPersistentEntity (Person .class ));
204217
205218 assertThat (mappedObject ).hasToString ("COUNT(my_aliased_table.another_name)" );
206219 }
@@ -211,7 +224,7 @@ void shouldMapExpressionToUnknownColumn() {
211224 Table table = Table .create ("my_table" ).as ("my_aliased_table" );
212225
213226 Expression mappedObject = mapper .getMappedObject (table .column ("unknown" ).as ("my_aliased_col" ),
214- context .getRequiredPersistentEntity (Person .class ));
227+ mapper . getMappingContext () .getRequiredPersistentEntity (Person .class ));
215228
216229 assertThat (mappedObject ).hasToString ("my_aliased_table.unknown AS my_aliased_col" );
217230 }
@@ -392,7 +405,7 @@ void shouldMapSort() {
392405
393406 Sort sort = Sort .by (desc ("alternative" ));
394407
395- Sort mapped = mapper .getMappedObject (sort , context .getRequiredPersistentEntity (Person .class ));
408+ Sort mapped = mapper .getMappedObject (sort , mapper . getMappingContext () .getRequiredPersistentEntity (Person .class ));
396409
397410 assertThat (mapped .getOrderFor ("another_name" )).isEqualTo (desc ("another_name" ));
398411 assertThat (mapped .getOrderFor ("alternative" )).isNull ();
@@ -403,7 +416,7 @@ void mapSortForPropertyPathInPrimitiveShouldFallBackToColumnName() {
403416
404417 Sort sort = Sort .by (desc ("alternative_name" ));
405418
406- Sort mapped = mapper .getMappedObject (sort , context .getRequiredPersistentEntity (Person .class ));
419+ Sort mapped = mapper .getMappedObject (sort , mapper . getMappingContext () .getRequiredPersistentEntity (Person .class ));
407420 assertThat (mapped .getOrderFor ("alternative_name" )).isEqualTo (desc ("alternative_name" ));
408421 }
409422
@@ -427,19 +440,44 @@ void mapQueryForEnumArrayShouldMapToStringList() {
427440 assertThat (bindings .getCondition ()).hasToString ("person.enum_value IN (?[$1], ?[$2])" );
428441 }
429442
443+ @ Test // gh-733
444+ void shouldMapBooleanConditionProperly () {
445+
446+ Criteria criteria = Criteria .where ("state" ).isFalse ();
447+
448+ BoundCondition bindings = map (criteria );
449+
450+ assertThat (bindings .getCondition ()).hasToString ("person.state = ?[$1]" );
451+ assertThat (bindings .getBindings ().iterator ().next ().getValue ()).isEqualTo (false );
452+ }
453+
454+ @ Test // gh-733
455+ void shouldMapAndConvertBooleanConditionProperly () {
456+
457+ mapper = createMapper (MySqlDialect .INSTANCE );
458+ Criteria criteria = Criteria .where ("state" ).isTrue ();
459+
460+ BoundCondition bindings = map (criteria );
461+
462+ assertThat (bindings .getCondition ()).hasToString ("person.state = ?[$1]" );
463+ assertThat (bindings .getBindings ().iterator ().next ().getValue ()).isEqualTo ((byte ) 1 );
464+ }
465+
430466 private BoundCondition map (Criteria criteria ) {
431467
432468 BindMarkersFactory markers = BindMarkersFactory .indexed ("$" , 1 );
433469
434470 return mapper .getMappedObject (markers .create (), criteria , Table .create ("person" ),
435- context .getRequiredPersistentEntity (Person .class ));
471+ mapper . getMappingContext () .getRequiredPersistentEntity (Person .class ));
436472 }
437473
438474 static class Person {
439475
440476 String name ;
441477 @ Column ("another_name" ) String alternative ;
442478 MyEnum enumValue ;
479+
480+ boolean state ;
443481 }
444482
445483 enum MyEnum {
0 commit comments