Skip to content

Commit e82e122

Browse files
Use bindMarker for BY_INDEX and BY_NAME IN queries
See spring-projects#1172
1 parent 537f96b commit e82e122

File tree

3 files changed

+13
-13
lines changed

3 files changed

+13
-13
lines changed

spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java

+11
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969

7070
import com.datastax.oss.driver.api.core.CqlIdentifier;
7171
import com.datastax.oss.driver.api.core.metadata.schema.ClusteringOrder;
72+
import com.datastax.oss.driver.api.querybuilder.BindMarker;
7273
import com.datastax.oss.driver.api.querybuilder.QueryBuilder;
7374
import com.datastax.oss.driver.api.querybuilder.condition.Condition;
7475
import com.datastax.oss.driver.api.querybuilder.condition.ConditionBuilder;
@@ -966,6 +967,11 @@ private static Relation toClause(CriteriaDefinition criteriaDefinition, TermFact
966967

967968
if (predicate.getValue() instanceof List
968969
|| (predicate.getValue() != null && predicate.getValue().getClass().isArray())) {
970+
Term term = factory.create(predicate.getValue());
971+
if (term instanceof BindMarker) {
972+
return column.in((BindMarker) term);
973+
}
974+
969975
return column.in(toLiterals(predicate.getValue()));
970976
}
971977

@@ -1031,6 +1037,11 @@ private static Condition toCondition(CriteriaDefinition criteriaDefinition, Term
10311037

10321038
if (predicate.getValue() instanceof List
10331039
|| (predicate.getValue() != null && predicate.getValue().getClass().isArray())) {
1040+
Term term = factory.create(predicate.getValue());
1041+
if (term instanceof BindMarker) {
1042+
return column.in((BindMarker) term);
1043+
}
1044+
10341045
return column.in(toLiterals(predicate.getValue()));
10351046
}
10361047

spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/ReactiveCassandraRepositoryIntegrationTests.java

-11
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121

2222
import java.util.Arrays;
2323
import java.util.HashSet;
24-
import java.util.List;
2524
import java.util.Set;
2625

2726
import org.junit.jupiter.api.BeforeEach;
@@ -126,14 +125,6 @@ void setUp() throws Exception {
126125
.verifyComplete();
127126
}
128127

129-
@Test
130-
void shouldFindByIdIn() {
131-
// Statement generated does not use a bind marker for the IN clause (uses hard-coded values, causing issues
132-
// with prepared statement generation)
133-
List<String> ids = Arrays.asList(dave.getId(), carter.getId());
134-
repository.findByIdIn(new HashSet<>(ids)).as(StepVerifier::create).expectNextCount(2).verifyComplete();
135-
}
136-
137128
@Test // DATACASS-335
138129
void shouldFindByLastName() {
139130
repository.findByLastname(dave.getLastname()).as(StepVerifier::create).expectNextCount(2).verifyComplete();
@@ -241,8 +232,6 @@ void shouldApplyExistsProjection() {
241232

242233
interface UserRepository extends ReactiveCassandraRepository<User, String> {
243234

244-
Flux<User> findByIdIn(Set<String> ids);
245-
246235
Flux<User> findByLastname(String lastname);
247236

248237
Mono<Slice<User>> findByLastname(String firstname, Pageable pageable);

spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/query/PartTreeCassandraQueryUnitTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ void shouldDeriveFieldInCollectionQuery() {
159159
String query = deriveQueryFromMethod(Repo.class, "findByFirstnameIn", new Class[] { Collection.class },
160160
Arrays.asList("Hank", "Walter")).getQuery();
161161

162-
assertThat(query).isEqualTo("SELECT * FROM person WHERE firstname IN ('Hank','Walter')");
162+
assertThat(query).isEqualTo("SELECT * FROM person WHERE firstname IN ?");
163163
}
164164

165165
@Test // DATACASS-172
@@ -186,7 +186,7 @@ void shouldDeriveUdtInCollectionQuery() {
186186
String query = deriveQueryFromMethod(Repo.class, "findByMainAddressIn", new Class[] { Collection.class },
187187
Collections.singleton(udtValue)).getQuery();
188188

189-
assertThat(query).isEqualTo("SELECT * FROM person WHERE mainaddress IN ({city:NULL,country:NULL})");
189+
assertThat(query).isEqualTo("SELECT * FROM person WHERE mainaddress IN ?");
190190
}
191191

192192
@Test // DATACASS-343

0 commit comments

Comments
 (0)