Skip to content

Commit 55b3cbc

Browse files
[fix] Fix searching with the separator "+" (darrachequesne#55)
Previously, searching with "+" threw SQLException on (at least) Postgres and MySQL.
1 parent f8cc2bc commit 55b3cbc

File tree

6 files changed

+58
-0
lines changed

6 files changed

+58
-0
lines changed

src/main/java/org/springframework/data/jpa/datatables/qrepository/PredicateFactory.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ public static Predicate createPredicate(PathBuilder<?> entity, DataTablesInput i
5757
predicate = predicate.and(in);
5858
}
5959
} else {
60+
if (values.isEmpty()) {
61+
if (nullable) {
62+
predicate = predicate.and(entity.get(column.getData()).isNull());
63+
}
64+
continue;
65+
}
6066
Predicate in = getStringExpression(entity, column.getData()).in(values);
6167
if (nullable) {
6268
predicate = predicate.and(entity.get(column.getData()).isNull().or(in));

src/main/java/org/springframework/data/jpa/datatables/repository/SpecificationFactory.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuild
8080
}
8181
} else {
8282
stringExpression = getExpression(root, column.getData(), String.class);
83+
if (values.isEmpty()) {
84+
if (nullable) {
85+
predicate = cb.and(predicate, stringExpression.isNull());
86+
}
87+
continue;
88+
}
8389
Predicate in = stringExpression.in(values);
8490
if (nullable) {
8591
predicate = cb.and(predicate, cb.or(in, stringExpression.isNull()));

src/test/java/org/springframework/data/jpa/datatables/qrepository/QBillRepositoryTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,17 @@ public void testFilterIsNull() {
6666
assertEquals(1, output.getRecordsFiltered());
6767
}
6868

69+
@Test
70+
public void testFilterIsNullWithSeparator() {
71+
DataTablesInput input = getBasicInput();
72+
73+
input.getColumn("hasBeenPayed").setSearchValue("NULL+");
74+
DataTablesOutput<Bill> output = billRepository.findAll(input);
75+
assertNotNull(output);
76+
assertNull(output.getError());
77+
assertEquals(1, output.getRecordsFiltered());
78+
}
79+
6980
@Test
7081
public void testBooleanFilter2() {
7182
DataTablesInput input = getBasicInput();

src/test/java/org/springframework/data/jpa/datatables/qrepository/QUserRepositoryTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,18 @@ public void testMultiFilterOnSameColumn() {
241241
assertEquals("USER", lastUser.getRole().toString());
242242
}
243243

244+
@Test
245+
public void testEmptyMultiFilterOnSameColumn() {
246+
DataTablesInput input = getBasicInput();
247+
248+
input.getColumn("role").setSearchValue("+");
249+
250+
DataTablesOutput<User> output = userRepository.findAll(input);
251+
assertNotNull(output);
252+
assertNull(output.getError());
253+
assertEquals(24, output.getRecordsFiltered());
254+
}
255+
244256
@Test
245257
public void testFilterOnManyToOneRelationship() {
246258
DataTablesInput input = getBasicInput();

src/test/java/org/springframework/data/jpa/datatables/repository/BillRepositoryTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,17 @@ public void testFilterIsNull() {
6767
assertEquals(1, output.getRecordsFiltered());
6868
}
6969

70+
@Test
71+
public void testFilterIsNullWithSeparator() {
72+
DataTablesInput input = getBasicInput();
73+
74+
input.getColumn("hasBeenPayed").setSearchValue("NULL+");
75+
DataTablesOutput<Bill> output = billRepository.findAll(input);
76+
assertNotNull(output);
77+
assertNull(output.getError());
78+
assertEquals(1, output.getRecordsFiltered());
79+
}
80+
7081
@Test
7182
public void testBooleanFilter2() {
7283
DataTablesInput input = getBasicInput();

src/test/java/org/springframework/data/jpa/datatables/repository/UserRepositoryTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,18 @@ public void testMultiFilterOnSameColumn() {
238238
assertEquals("USER", lastUser.getRole().toString());
239239
}
240240

241+
@Test
242+
public void testEmptyMultiFilterOnSameColumn() {
243+
DataTablesInput input = getBasicInput();
244+
245+
input.getColumn("role").setSearchValue("+");
246+
247+
DataTablesOutput<User> output = userRepository.findAll(input);
248+
assertNotNull(output);
249+
assertNull(output.getError());
250+
assertEquals(24, output.getRecordsFiltered());
251+
}
252+
241253
@Test
242254
public void testFilterOnManyToOneRelationship() {
243255
DataTablesInput input = getBasicInput();

0 commit comments

Comments
 (0)