Skip to content

Commit 34f339d

Browse files
committed
GH-2020 code review fixes
1 parent b91dcf5 commit 34f339d

File tree

5 files changed

+37
-73
lines changed

5 files changed

+37
-73
lines changed

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

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import org.springframework.data.jdbc.core.convert.JdbcConverter;
3636
import org.springframework.data.jdbc.core.mapping.JdbcValue;
3737
import org.springframework.data.jdbc.support.JdbcUtil;
38-
import org.springframework.data.relational.core.dialect.SqlTypeResolver;
3938
import org.springframework.data.relational.core.mapping.RelationalMappingContext;
4039
import org.springframework.data.relational.repository.query.RelationalParameterAccessor;
4140
import org.springframework.data.relational.repository.query.RelationalParametersParameterAccessor;
@@ -86,17 +85,13 @@ public class StringBasedJdbcQuery extends AbstractJdbcQuery {
8685

8786
/**
8887
* Creates a new {@link StringBasedJdbcQuery} for the given {@link JdbcQueryMethod}, {@link RelationalMappingContext}
89-
<<<<<<< HEAD
90-
* and {@link org.springframework.data.jdbc.repository.query.RowMapperFactory}.
91-
=======
9288
* and {@link RowMapperFactory}.
93-
>>>>>>> d92a7298 (GH-2020 Added SqlTypeResolver abstraction)
9489
*
95-
* @param queryMethod must not be {@literal null}.
96-
* @param operations must not be {@literal null}.
90+
* @param queryMethod must not be {@literal null}.
91+
* @param operations must not be {@literal null}.
9792
* @param rowMapperFactory must not be {@literal null}.
98-
* @param converter must not be {@literal null}.
99-
* @param delegate must not be {@literal null}.
93+
* @param converter must not be {@literal null}.
94+
* @param delegate must not be {@literal null}.
10095
* @since 3.4
10196
*/
10297
public StringBasedJdbcQuery(JdbcQueryMethod queryMethod, NamedParameterJdbcOperations operations,
@@ -109,12 +104,12 @@ public StringBasedJdbcQuery(JdbcQueryMethod queryMethod, NamedParameterJdbcOpera
109104
* Creates a new {@link StringBasedJdbcQuery} for the given {@link JdbcQueryMethod}, {@link RelationalMappingContext}
110105
* and {@link org.springframework.data.jdbc.repository.query.RowMapperFactory}.
111106
*
112-
* @param query must not be {@literal null} or empty.
113-
* @param queryMethod must not be {@literal null}.
114-
* @param operations must not be {@literal null}.
107+
* @param query must not be {@literal null} or empty.
108+
* @param queryMethod must not be {@literal null}.
109+
* @param operations must not be {@literal null}.
115110
* @param rowMapperFactory must not be {@literal null}.
116-
* @param converter must not be {@literal null}.
117-
* @param delegate must not be {@literal null}.
111+
* @param converter must not be {@literal null}.
112+
* @param delegate must not be {@literal null}.
118113
* @since 3.4
119114
*/
120115
public StringBasedJdbcQuery(String query, JdbcQueryMethod queryMethod, NamedParameterJdbcOperations operations,
@@ -159,10 +154,6 @@ public StringBasedJdbcQuery(String query, JdbcQueryMethod queryMethod, NamedPara
159154
this.delegate = delegate;
160155
}
161156

162-
<<<<<<< HEAD
163-
=======
164-
165-
>>>>>>> d92a7298 (GH-2020 Added SqlTypeResolver abstraction)
166157
@Override
167158
public Object execute(Object[] objects) {
168159

@@ -356,7 +347,8 @@ private static boolean isUnconfigured(@Nullable Class<?> configuredClass, Class<
356347
}
357348

358349
@Deprecated(since = "3.4")
359-
public void setBeanFactory(BeanFactory beanFactory) {}
350+
public void setBeanFactory(BeanFactory beanFactory) {
351+
}
360352

361353
class CachedRowMapperFactory {
362354

@@ -415,19 +407,20 @@ public CachedResultSetExtractorFactory(Supplier<RowMapper<?>> resultSetExtractor
415407
String resultSetExtractorRef = getQueryMethod().getResultSetExtractorRef();
416408
Class<? extends ResultSetExtractor> resultSetExtractorClass = getQueryMethod().getResultSetExtractorClass();
417409

418-
if (!ObjectUtils.isEmpty(resultSetExtractorRef)
419-
&& !isUnconfigured(resultSetExtractorClass, ResultSetExtractor.class)) {
410+
if (!ObjectUtils.isEmpty(resultSetExtractorRef) && !isUnconfigured(resultSetExtractorClass,
411+
ResultSetExtractor.class)) {
420412
throw new IllegalArgumentException(
421413
"Invalid ResultSetExtractor configuration. Configure either one but not both via @Query(resultSetExtractorRef = …, resultSetExtractorClass = …) for query method "
422414
+ getQueryMethod());
423415
}
424416

425-
this.configuredResultSetExtractor = !ObjectUtils.isEmpty(resultSetExtractorRef)
426-
|| !isUnconfigured(resultSetExtractorClass, ResultSetExtractor.class);
417+
this.configuredResultSetExtractor =
418+
!ObjectUtils.isEmpty(resultSetExtractorRef) || !isUnconfigured(resultSetExtractorClass,
419+
ResultSetExtractor.class);
427420

428-
this.rowMapperConstructor = resultSetExtractorClass != null
429-
? ClassUtils.getConstructorIfAvailable(resultSetExtractorClass, RowMapper.class)
430-
: null;
421+
this.rowMapperConstructor = resultSetExtractorClass != null ?
422+
ClassUtils.getConstructorIfAvailable(resultSetExtractorClass, RowMapper.class) :
423+
null;
431424
this.constructor = resultSetExtractorClass != null ? findPrimaryConstructor(resultSetExtractorClass) : null;
432425
this.resultSetExtractorFactory = rowMapper -> {
433426

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import static org.mockito.ArgumentMatchers.*;
2020
import static org.mockito.Mockito.*;
2121

22+
import java.lang.reflect.Array;
2223
import java.lang.reflect.Method;
2324
import java.sql.JDBCType;
2425
import java.sql.ResultSet;
@@ -95,7 +96,7 @@ public void testSqlTypeResolver() throws NoSuchMethodException {
9596
JdbcQueryMethod queryMethod = createJdbcQueryMethod(
9697
"findUserTestMethod",
9798
new DefaultSqlTypeResolver(),
98-
Integer.class, String.class, List.class
99+
Integer.class, String.class, Integer[].class
99100
);
100101

101102
JdbcParameters parameters = queryMethod.getParameters();
@@ -196,7 +197,7 @@ private void queryMethodWithWriteLock() {}
196197
private void findUserTestMethod(
197198
@SqlType(name = "TINYINT", vendorTypeNumber = Types.TINYINT) Integer age,
198199
String name,
199-
List<@SqlType(name = "SMALLINT", vendorTypeNumber = Types.SMALLINT) Integer> statuses
200+
@SqlType(name = "SMALLINT", vendorTypeNumber = Types.SMALLINT) Integer[] statuses
200201
) {}
201202

202203
@Lock(LockMode.PESSIMISTIC_READ)

spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/DefaultSqlTypeResolver.java

Lines changed: 12 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2020-2025 the original author or authors.
2+
* Copyright 2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,29 +16,24 @@
1616

1717
package org.springframework.data.relational.core.dialect;
1818

19-
import java.lang.reflect.AnnotatedParameterizedType;
20-
import java.lang.reflect.AnnotatedType;
21-
import java.lang.reflect.Parameter;
2219
import java.sql.SQLType;
2320

24-
import org.springframework.core.MethodParameter;
25-
import org.springframework.data.relational.repository.query.SqlType;
2621
import org.springframework.data.relational.repository.query.RelationalParameters;
27-
import org.springframework.data.util.TypeInformation;
22+
import org.springframework.data.relational.repository.query.SqlType;
2823
import org.springframework.lang.Nullable;
2924
import org.springframework.util.Assert;
3025

3126
/**
3227
* Default implementation of {@link SqlTypeResolver}. Capable to resolve the {@link SqlType} annotation
33-
* on the {@link java.lang.annotation.ElementType#TYPE_USE}, like this:
28+
* on the {@link java.lang.annotation.ElementType#PARAMETER method parameters}, like this:
3429
* <p>
3530
* <pre class="code">
3631
* List<User> findByAge(&#64;SqlType(name = "TINYINT", vendorTypeNumber = Types.TINYINT) byte age);
3732
* </pre>
3833
*
39-
* Or, if the intention is to specify the actual {@link SQLType}, then the following needs to be done:
34+
* Qualification of the actual {@link SQLType} (the sql type of the component), then the following needs to be done:
4035
* <pre class="code">
41-
* List<User> findByAgeIn(List<&#64;SqlType(name = "TINYINT", vendorTypeNumber = Types.TINYINT) Integer> age);
36+
* List<User> findByAgeIn(&#64;SqlType(name = "TINYINT", vendorTypeNumber = Types.TINYINT) Integer[] age);
4237
* </pre>
4338
*
4439
* @author Mikhail Polivakha
@@ -50,46 +45,21 @@ public class DefaultSqlTypeResolver implements SqlTypeResolver {
5045
@Override
5146
@Nullable
5247
public SQLType resolveSqlType(RelationalParameters.RelationalParameter relationalParameter) {
53-
SqlType parameterAnnotation = relationalParameter.getMethodParameter().getParameterAnnotation(SqlType.class);
54-
55-
if (parameterAnnotation != null) {
56-
return new AnnotationBasedSqlType(parameterAnnotation);
57-
} else {
58-
return null;
59-
}
48+
return resolveInternally(relationalParameter);
6049
}
6150

6251
@Override
6352
@Nullable
6453
public SQLType resolveActualSqlType(RelationalParameters.RelationalParameter relationalParameter) {
65-
MethodParameter methodParameter = relationalParameter.getMethodParameter();
66-
67-
TypeInformation<?> typeOfParameter = TypeInformation.of(methodParameter.getParameterType());
68-
69-
if (typeOfParameter.isCollectionLike()) {
70-
Parameter parameter = methodParameter.getParameter();
71-
AnnotatedType annotatedType = parameter.getAnnotatedType();
72-
73-
if (annotatedType instanceof AnnotatedParameterizedType parameterizedType) {
74-
return searchForGenericTypeUseAnnotation(parameterizedType);
75-
}
76-
}
77-
78-
return null;
54+
return resolveInternally(relationalParameter);
7955
}
8056

81-
@Nullable
82-
private static AnnotationBasedSqlType searchForGenericTypeUseAnnotation(AnnotatedParameterizedType parameterizedType) {
83-
AnnotatedType[] annotatedArguments = parameterizedType.getAnnotatedActualTypeArguments();
84-
85-
if (annotatedArguments.length != 1) {
86-
return null;
87-
}
88-
89-
SqlType typeUseSqlTypeAnnotation = annotatedArguments[0].getAnnotation(SqlType.class);
57+
private static AnnotationBasedSqlType resolveInternally(
58+
RelationalParameters.RelationalParameter relationalParameter) {
59+
SqlType parameterAnnotation = relationalParameter.getMethodParameter().getParameterAnnotation(SqlType.class);
9060

91-
if (typeUseSqlTypeAnnotation != null) {
92-
return new AnnotationBasedSqlType(typeUseSqlTypeAnnotation);
61+
if (parameterAnnotation != null) {
62+
return new AnnotationBasedSqlType(parameterAnnotation);
9363
} else {
9464
return null;
9565
}

spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlTypeResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2020-2025 the original author or authors.
2+
* Copyright 2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.

spring-data-relational/src/main/java/org/springframework/data/relational/repository/query/SqlType.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@
2929
* Serves as a hint to the {@link DefaultSqlTypeResolver}, that signals the {@link java.sql.SQLType} to be used.
3030
* The arguments of this annotation are identical to the methods on {@link java.sql.SQLType} interface, expect for
3131
* the {@link SQLType#getVendor()}, which is absent, because it typically does not matter as such for the underlying
32-
* JDBC drivers. For examples of usage, take a look onto {@link DefaultSqlTypeResolver}.
32+
* JDBC drivers. The examples of usage, can be found in javadoc of {@link DefaultSqlTypeResolver}.
3333
*
3434
* @see DefaultSqlTypeResolver
3535
* @author Mikhail Polivakha
3636
*/
3737
@Documented
38-
@Target({ElementType.PARAMETER, ElementType.TYPE_USE})
38+
@Target({ElementType.PARAMETER})
3939
@Retention(RetentionPolicy.RUNTIME)
4040
public @interface SqlType {
4141

0 commit comments

Comments
 (0)