From 7902d0e11b4eae69c7d3836c9910aa281ffe7cf0 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 5 Jul 2023 15:21:48 +0200 Subject: [PATCH] =?UTF-8?q?Use=20bind=20markers=20for=20SELECT=20=E2=80=A6?= =?UTF-8?q?=20LIMIT=20when=20possible.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When using bind markers (named/by index) we now apply bind markers for LIMIT to avoid excessive prepared statement amounts. See #1401 --- .../data/cassandra/core/StatementFactory.java | 12 ++++++----- .../core/StatementFactoryUnitTests.java | 21 +++++++++++++++++-- .../PartTreeCassandraQueryUnitTests.java | 4 ++-- ...activePartTreeCassandraQueryUnitTests.java | 4 ++-- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java index ae1ac73fa..c5f2ff5f6 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java @@ -632,17 +632,19 @@ public class StatementFactory { StatementBuilder select = statementFactory.select(query, + converter.getMappingContext().getRequiredPersistentEntity(Group.class)); + + assertThat(select.build(ParameterHandling.INLINE).getQuery()) + .isEqualTo("SELECT * FROM group WHERE email='e@mail' LIMIT 10"); + + SimpleStatement statement = select.build(ParameterHandling.BY_INDEX); + assertThat(statement.getQuery()).isEqualTo("SELECT * FROM group WHERE email=? LIMIT ?"); + assertThat(statement.getPositionalValues()).containsExactly("e@mail", 10); + } + @Test // DATACASS-343 void shouldMapSelectQueryWithSortByEmbeddedLimitAndAllowFiltering() { diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/query/PartTreeCassandraQueryUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/query/PartTreeCassandraQueryUnitTests.java index ad4c03be4..f4c65c78c 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/query/PartTreeCassandraQueryUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/query/PartTreeCassandraQueryUnitTests.java @@ -242,12 +242,12 @@ class PartTreeCassandraQueryUnitTests { assertThat(statement.getQuery()).isEqualTo("DELETE FROM person WHERE lastname=?"); } - @Test // DATACASS-512 + @Test // DATACASS-512, GH-1401 void shouldCreateExistsQuery() { SimpleStatement statement = deriveQueryFromMethod(Repo.class, "existsBy", new Class[0]); - assertThat(statement.getQuery()).isEqualTo("SELECT * FROM person LIMIT 1"); + assertThat(statement.getQuery()).isEqualTo("SELECT * FROM person LIMIT ?"); } private String deriveQueryFromMethod(String method, Object... args) { diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/query/ReactivePartTreeCassandraQueryUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/query/ReactivePartTreeCassandraQueryUnitTests.java index ca410135f..b2315a709 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/query/ReactivePartTreeCassandraQueryUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/query/ReactivePartTreeCassandraQueryUnitTests.java @@ -149,13 +149,13 @@ class ReactivePartTreeCassandraQueryUnitTests { assertThat(statement.getQuery()).isEqualTo("DELETE FROM person WHERE lastname=?"); } - @Test // DATACASS-512 + @Test // DATACASS-512, GH-1401 void shouldCreateExistsQuery() { SimpleStatement statement = deriveQueryFromMethod(PartTreeCassandraQueryUnitTests.Repo.class, "existsBy", new Class[0]); - assertThat(statement.getQuery()).isEqualTo("SELECT * FROM person LIMIT 1"); + assertThat(statement.getQuery()).isEqualTo("SELECT * FROM person LIMIT ?"); } private String deriveQueryFromMethod(String method, Object... args) {