diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/QueryMapper.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/QueryMapper.java index b56b3bb1f..cd27c1fa3 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/QueryMapper.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/QueryMapper.java @@ -191,7 +191,7 @@ class QueryMapper { Condition condition = getCondition(criterion, parameterSource, table, entity); if (condition != null) { - result = combine(criterion, mapped, criterion.getCombinator(), condition); + result = combine(mapped, criterion.getCombinator(), condition); } if (result != null) { @@ -221,7 +221,7 @@ class QueryMapper { Condition condition = unroll(criterion, table, entity, parameterSource); - mapped = combine(criterion, mapped, combinator, condition); + mapped = combine(mapped, combinator, condition); } return mapped; @@ -245,17 +245,19 @@ class QueryMapper { return mapCondition(criteria, parameterSource, table, entity); } - private Condition combine(CriteriaDefinition criteria, @Nullable Condition currentCondition, + private Condition combine(@Nullable Condition currentCondition, CriteriaDefinition.Combinator combinator, Condition nextCondition) { if (currentCondition == null) { currentCondition = nextCondition; + } else if (combinator == CriteriaDefinition.Combinator.INITIAL) { + currentCondition = currentCondition.and(Conditions.nest(nextCondition)); } else if (combinator == CriteriaDefinition.Combinator.AND) { currentCondition = currentCondition.and(nextCondition); } else if (combinator == CriteriaDefinition.Combinator.OR) { currentCondition = currentCondition.or(nextCondition); } else { - throw new IllegalStateException("Combinator " + criteria.getCombinator() + " not supported"); + throw new IllegalStateException("Combinator " + combinator + " not supported"); } return currentCondition; diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/query/QueryMapperUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/query/QueryMapperUnitTests.java index 658e55dc6..3a55bd138 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/query/QueryMapperUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/query/QueryMapperUnitTests.java @@ -126,6 +126,20 @@ public class QueryMapperUnitTests { .hasToString("person.\"NAME\" = ?[:name] AND (person.\"NAME\" = ?[:name1] OR person.age < ?[:age])"); } + @Test // DATAJDBC-560 + public void shouldMapFromConcat() { + + Criteria criteria = Criteria.from(Criteria.where("name").is("Foo"), Criteria.where("name").is("Bar") // + .or("age").lessThan(49)); + + assertThat(criteria.isEmpty()).isFalse(); + + Condition condition = map(criteria); + + assertThat(condition) + .hasToString("(person.\"NAME\" = ?[:name] AND (person.\"NAME\" = ?[:name1] OR person.age < ?[:age]))"); + } + @Test // DATAJDBC-318 public void shouldMapSimpleCriteria() {