Skip to content

Commit 721a7ad

Browse files
committed
Implement equals and hashCode for Criteria.
This facilitates testing of Criteria construction and is also usful, when keeping Criteria instances in sets or similar. Closes #1960
1 parent e4ba477 commit 721a7ad

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Criteria.java

+23
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.HashMap;
2222
import java.util.List;
2323
import java.util.Map;
24+
import java.util.Objects;
2425
import java.util.StringJoiner;
2526

2627
import org.springframework.dao.InvalidDataAccessApiUsageException;
@@ -390,6 +391,28 @@ public String toString() {
390391
return builder.toString();
391392
}
392393

394+
@Override
395+
public boolean equals(Object o) {
396+
397+
if (o == null || getClass() != o.getClass()) {
398+
return false;
399+
}
400+
401+
Criteria criteria = (Criteria) o;
402+
return ignoreCase == criteria.ignoreCase //
403+
&& Objects.equals(previous, criteria.previous) //
404+
&& combinator == criteria.combinator //
405+
&& Objects.equals(group, criteria.group) //
406+
&& Objects.equals(column, criteria.column) //
407+
&& comparator == criteria.comparator //
408+
&& Objects.equals(value, criteria.value);
409+
}
410+
411+
@Override
412+
public int hashCode() {
413+
return Objects.hash(previous, combinator, group, column, comparator, value, ignoreCase);
414+
}
415+
393416
private void unroll(CriteriaDefinition criteria, StringBuilder stringBuilder) {
394417

395418
CriteriaDefinition current = criteria;

spring-data-relational/src/test/java/org/springframework/data/relational/core/query/CriteriaUnitTests.java

+27-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import java.util.Arrays;
2323

2424
import org.junit.jupiter.api.Test;
25-
2625
import org.springframework.data.relational.core.sql.SqlIdentifier;
2726

2827
/**
@@ -297,4 +296,31 @@ void shouldBuildIsFalseCriteria() {
297296
assertThat(criteria.getComparator()).isEqualTo(CriteriaDefinition.Comparator.IS_FALSE);
298297
assertThat(criteria.getValue()).isEqualTo(false);
299298
}
299+
300+
@Test // GH-1960
301+
void identicallyCreatedCriteriaAreEqual() {
302+
303+
Criteria c1 = Criteria.where("status").in("PUBLISHED", "DRAFT");
304+
Criteria c2 = Criteria.where("status").in("PUBLISHED", "DRAFT");
305+
306+
assertThat(c1).isEqualTo(c2);
307+
assertThat(c1.hashCode()).isEqualTo(c2.hashCode());
308+
}
309+
310+
@Test // GH-1960
311+
void notIdenticallyCreatedCriteriaAreNotEqual() {
312+
313+
Criteria[] criteria = new Criteria[] { Criteria.where("status").is("PUBLISHED"), //
314+
Criteria.where("statusx").is("PUBLISHED"), //
315+
Criteria.where("status").greaterThan("PUBLISHED"), //
316+
Criteria.where("status").is("PUBLISHEDx") };
317+
318+
for (int i = 0; i < criteria.length - 1; i++) {
319+
for (int j = i + 1; j < criteria.length; j++) {
320+
321+
assertThat(criteria[i]).isNotEqualTo(criteria[j]);
322+
assertThat(criteria[i].hashCode()).isNotEqualTo(criteria[j].hashCode());
323+
}
324+
}
325+
}
300326
}

0 commit comments

Comments
 (0)