From 3d995655dca3d64c1233d19a0c504b57a69a48ba Mon Sep 17 00:00:00 2001 From: mipo256 Date: Mon, 10 Mar 2025 11:33:34 +0300 Subject: [PATCH] Clarify the @Lock on String-based queries Signed-off-by: mipo256 --- .../data/jdbc/repository/query/StringBasedJdbcQuery.java | 8 ++++++++ src/main/antora/modules/ROOT/pages/jdbc/transactions.adoc | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQuery.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQuery.java index 89df22fd75..efa4c4ca50 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQuery.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQuery.java @@ -27,6 +27,8 @@ import java.util.function.Function; import java.util.function.Supplier; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeanInstantiationException; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.BeanFactory; @@ -78,6 +80,8 @@ public class StringBasedJdbcQuery extends AbstractJdbcQuery { private static final String PARAMETER_NEEDS_TO_BE_NAMED = "For queries with named parameters you need to provide names for method parameters; Use @Param for query method parameters, or use the javac flag -parameters"; + private final static String LOCKING_IS_NOT_SUPPORTED = "Currently, @Lock is supported only on derived queries. In other words, for queries created with @Query, the locking condition specified with @Lock does nothing"; + private static final Log LOG = LogFactory.getLog(StringBasedJdbcQuery.class); private final JdbcConverter converter; private final RowMapperFactory rowMapperFactory; private final ValueExpressionQueryRewriter.ParsedQuery parsedQuery; @@ -187,6 +191,10 @@ public StringBasedJdbcQuery(String query, JdbcQueryMethod queryMethod, NamedPara (counter, expression) -> String.format("__$synthetic$__%d", counter + 1), String::concat); this.query = query; + + if (queryMethod.hasLockMode()) { + LOG.warn(LOCKING_IS_NOT_SUPPORTED); + } this.parsedQuery = rewriter.parse(this.query); this.delegate = delegate; } diff --git a/src/main/antora/modules/ROOT/pages/jdbc/transactions.adoc b/src/main/antora/modules/ROOT/pages/jdbc/transactions.adoc index 7f87f6cd44..84b48ad239 100644 --- a/src/main/antora/modules/ROOT/pages/jdbc/transactions.adoc +++ b/src/main/antora/modules/ROOT/pages/jdbc/transactions.adoc @@ -101,6 +101,10 @@ The required value of type `LockMode` offers two values: `PESSIMISTIC_READ` whic Some databases do not make this distinction. In that cases both modes are equivalent of `PESSIMISTIC_WRITE`. +NOTE: It is worth stating explicitly, that `@Lock` currently is not supported on string-based queries. It means, +that queries in the repository, created with `@Query`, will ignore the locking information provided by the `@Lock`, +Using `@Lock` on string-based queries will result in the warning in logs. + .Using @Lock on derived query method [source,java] ----