Browse Source

Polishing.

Formatting.
Added a test.

Original pull request #2023
See #2008
pull/2065/head
Jens Schauder 8 months ago committed by Mark Paluch
parent
commit
00f4a61b82
No known key found for this signature in database
GPG Key ID: 55BC6374BAA9D973
  1. 3
      spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQuery.java
  2. 31
      spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQueryUnitTests.java

3
spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQuery.java

@ -73,7 +73,7 @@ import org.springframework.util.ObjectUtils;
public class StringBasedJdbcQuery extends AbstractJdbcQuery { 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 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. Offending method: "; private static final 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. Offending method: ";
private final JdbcConverter converter; private final JdbcConverter converter;
private final RowMapperFactory rowMapperFactory; private final RowMapperFactory rowMapperFactory;
private final ValueExpressionQueryRewriter.ParsedQuery parsedQuery; private final ValueExpressionQueryRewriter.ParsedQuery parsedQuery;
@ -457,6 +457,7 @@ public class StringBasedJdbcQuery extends AbstractJdbcQuery {
@Nullable @Nullable
static <T> Constructor<T> findPrimaryConstructor(Class<T> clazz) { static <T> Constructor<T> findPrimaryConstructor(Class<T> clazz) {
try { try {
return clazz.getDeclaredConstructor(); return clazz.getDeclaredConstructor();
} catch (NoSuchMethodException ex) { } catch (NoSuchMethodException ex) {

31
spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQueryUnitTests.java

@ -53,6 +53,8 @@ import org.springframework.data.jdbc.core.mapping.JdbcValue;
import org.springframework.data.jdbc.support.JdbcUtil; import org.springframework.data.jdbc.support.JdbcUtil;
import org.springframework.data.projection.SpelAwareProxyProjectionFactory; import org.springframework.data.projection.SpelAwareProxyProjectionFactory;
import org.springframework.data.relational.core.mapping.RelationalMappingContext; import org.springframework.data.relational.core.mapping.RelationalMappingContext;
import org.springframework.data.relational.core.sql.LockMode;
import org.springframework.data.relational.repository.Lock;
import org.springframework.data.repository.Repository; import org.springframework.data.repository.Repository;
import org.springframework.data.repository.core.support.DefaultRepositoryMetadata; import org.springframework.data.repository.core.support.DefaultRepositoryMetadata;
import org.springframework.data.repository.core.support.PropertiesBasedNamedQueries; import org.springframework.data.repository.core.support.PropertiesBasedNamedQueries;
@ -252,7 +254,7 @@ class StringBasedJdbcQueryUnitTests {
JdbcQueryMethod queryMethod = createMethod("sliceAll", Pageable.class); JdbcQueryMethod queryMethod = createMethod("sliceAll", Pageable.class);
assertThatThrownBy( assertThatThrownBy(
() -> new StringBasedJdbcQuery(queryMethod, operations, result -> defaultRowMapper, converter, delegate)) () -> new StringBasedJdbcQuery(queryMethod, operations, result -> defaultRowMapper, converter, delegate))
.isInstanceOf(UnsupportedOperationException.class) .isInstanceOf(UnsupportedOperationException.class)
.hasMessageContaining("Slice queries are not supported using string-based queries"); .hasMessageContaining("Slice queries are not supported using string-based queries");
} }
@ -278,6 +280,16 @@ class StringBasedJdbcQueryUnitTests {
.isInstanceOf(UnsupportedOperationException.class); .isInstanceOf(UnsupportedOperationException.class);
} }
@Test // GH-2023
void lockNotSupported() {
JdbcQueryMethod queryMethod = createMethod("unsupportedWithLock", Long.class);
assertThatThrownBy(
() -> new StringBasedJdbcQuery(queryMethod, operations, result -> defaultRowMapper, converter, delegate))
.isInstanceOf(UnsupportedOperationException.class);
}
@Test // GH-1212 @Test // GH-1212
void convertsEnumCollectionParameterIntoStringCollectionParameter() { void convertsEnumCollectionParameterIntoStringCollectionParameter() {
@ -355,10 +367,12 @@ class StringBasedJdbcQueryUnitTests {
List<EvaluationContextExtension> list = new ArrayList<>(); List<EvaluationContextExtension> list = new ArrayList<>();
list.add(new MyEvaluationContextProvider()); list.add(new MyEvaluationContextProvider());
QueryMethodValueEvaluationContextAccessor accessor = new QueryMethodValueEvaluationContextAccessor(new StandardEnvironment(), list); QueryMethodValueEvaluationContextAccessor accessor = new QueryMethodValueEvaluationContextAccessor(
new StandardEnvironment(), list);
this.delegate = new ValueExpressionDelegate(accessor, ValueExpressionParser.create()); this.delegate = new ValueExpressionDelegate(accessor, ValueExpressionParser.create());
StringBasedJdbcQuery sut = new StringBasedJdbcQuery(queryMethod, operations, result -> defaultRowMapper, converter, delegate); StringBasedJdbcQuery sut = new StringBasedJdbcQuery(queryMethod, operations, result -> defaultRowMapper, converter,
delegate);
ArgumentCaptor<SqlParameterSource> paramSource = ArgumentCaptor.forClass(SqlParameterSource.class); ArgumentCaptor<SqlParameterSource> paramSource = ArgumentCaptor.forClass(SqlParameterSource.class);
ArgumentCaptor<String> query = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> query = ArgumentCaptor.forClass(String.class);
@ -401,8 +415,8 @@ class StringBasedJdbcQueryUnitTests {
mock(RelationResolver.class)) mock(RelationResolver.class))
: this.converter; : this.converter;
StringBasedJdbcQuery query = new StringBasedJdbcQuery(method.getDeclaredQuery(), method, operations, result -> mock(RowMapper.class), StringBasedJdbcQuery query = new StringBasedJdbcQuery(method.getDeclaredQuery(), method, operations,
converter, delegate); result -> mock(RowMapper.class), converter, delegate);
query.execute(arguments); query.execute(arguments);
@ -438,7 +452,8 @@ class StringBasedJdbcQueryUnitTests {
} }
private StringBasedJdbcQuery createQuery(JdbcQueryMethod queryMethod, String preparedReference, Object value) { private StringBasedJdbcQuery createQuery(JdbcQueryMethod queryMethod, String preparedReference, Object value) {
return new StringBasedJdbcQuery(queryMethod, operations, new StubRowMapperFactory(preparedReference, value), converter, delegate); return new StringBasedJdbcQuery(queryMethod, operations, new StubRowMapperFactory(preparedReference, value),
converter, delegate);
} }
interface MyRepository extends Repository<Object, Long> { interface MyRepository extends Repository<Object, Long> {
@ -505,6 +520,10 @@ class StringBasedJdbcQueryUnitTests {
@Query("select count(1) from person where (firstname, lastname) in (:tuples)") @Query("select count(1) from person where (firstname, lastname) in (:tuples)")
Object findByListOfTuples(@Param("tuples") List<Object[]> tuples); Object findByListOfTuples(@Param("tuples") List<Object[]> tuples);
@Lock(value = LockMode.PESSIMISTIC_READ)
@Query("SELECT * FROM person WHERE id = :id")
DummyEntity unsupportedWithLock(Long id);
} }
private static class CustomRowMapper implements RowMapper<Object> { private static class CustomRowMapper implements RowMapper<Object> {

Loading…
Cancel
Save