Browse Source

DATAJDBC-560 - Fix Criteria mapping when composing a group from top-level criteria.

Using Criteria.from(…) with multiple Criteria objects now uses properly AND combination along with group nesting to render a correct criteria. Previously, the INITIAL combinator in groups caused a mapping exception.
pull/229/head
Mark Paluch 6 years ago
parent
commit
eeeb188117
No known key found for this signature in database
GPG Key ID: 51A00FA751B91849
  1. 10
      spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/QueryMapper.java
  2. 14
      spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/query/QueryMapperUnitTests.java

10
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); Condition condition = getCondition(criterion, parameterSource, table, entity);
if (condition != null) { if (condition != null) {
result = combine(criterion, mapped, criterion.getCombinator(), condition); result = combine(mapped, criterion.getCombinator(), condition);
} }
if (result != null) { if (result != null) {
@ -221,7 +221,7 @@ class QueryMapper {
Condition condition = unroll(criterion, table, entity, parameterSource); Condition condition = unroll(criterion, table, entity, parameterSource);
mapped = combine(criterion, mapped, combinator, condition); mapped = combine(mapped, combinator, condition);
} }
return mapped; return mapped;
@ -245,17 +245,19 @@ class QueryMapper {
return mapCondition(criteria, parameterSource, table, entity); 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) { CriteriaDefinition.Combinator combinator, Condition nextCondition) {
if (currentCondition == null) { if (currentCondition == null) {
currentCondition = nextCondition; currentCondition = nextCondition;
} else if (combinator == CriteriaDefinition.Combinator.INITIAL) {
currentCondition = currentCondition.and(Conditions.nest(nextCondition));
} else if (combinator == CriteriaDefinition.Combinator.AND) { } else if (combinator == CriteriaDefinition.Combinator.AND) {
currentCondition = currentCondition.and(nextCondition); currentCondition = currentCondition.and(nextCondition);
} else if (combinator == CriteriaDefinition.Combinator.OR) { } else if (combinator == CriteriaDefinition.Combinator.OR) {
currentCondition = currentCondition.or(nextCondition); currentCondition = currentCondition.or(nextCondition);
} else { } else {
throw new IllegalStateException("Combinator " + criteria.getCombinator() + " not supported"); throw new IllegalStateException("Combinator " + combinator + " not supported");
} }
return currentCondition; return currentCondition;

14
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])"); .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 @Test // DATAJDBC-318
public void shouldMapSimpleCriteria() { public void shouldMapSimpleCriteria() {

Loading…
Cancel
Save