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.
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user