Skip to content

Commit 87deefb

Browse files
committed
Convert array elements.
See #1565
1 parent 6389d0f commit 87deefb

File tree

2 files changed

+48
-12
lines changed

2 files changed

+48
-12
lines changed

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

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717

1818
import static org.springframework.data.jdbc.repository.query.JdbcQueryExecution.*;
1919

20+
import java.lang.reflect.Array;
2021
import java.lang.reflect.Constructor;
22+
import java.sql.JDBCType;
2123
import java.sql.SQLType;
2224
import java.util.ArrayList;
2325
import java.util.Collection;
@@ -45,6 +47,7 @@
4547
import org.springframework.data.repository.query.SpelQueryContext;
4648
import org.springframework.data.util.Lazy;
4749
import org.springframework.data.util.TypeInformation;
50+
import org.springframework.data.util.TypeUtils;
4851
import org.springframework.jdbc.core.ResultSetExtractor;
4952
import org.springframework.jdbc.core.RowMapper;
5053
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
@@ -205,24 +208,44 @@ private void convertAndAddParameter(MapSqlParameterSource parameters, Parameter
205208

206209
JdbcValue jdbcValue;
207210
if (typeInformation.isCollectionLike() //
208-
&& value instanceof Collection<?> //
209-
&& !typeInformation.getActualType().getType().isArray()
211+
&& value instanceof Collection<?> collectionValue//
210212
) {
213+
if ( typeInformation.getActualType().getType().isArray() ){
211214

212-
List<Object> mapped = new ArrayList<>();
213-
SQLType jdbcType = null;
215+
TypeInformation<?> arrayElementType = typeInformation.getActualType().getActualType();
214216

215-
TypeInformation<?> actualType = typeInformation.getRequiredActualType();
216-
for (Object o : (Iterable<?>) value) {
217-
JdbcValue elementJdbcValue = converter.writeJdbcValue(o, actualType, parameter.getActualSqlType());
218-
if (jdbcType == null) {
219-
jdbcType = elementJdbcValue.getJdbcType();
217+
List<Object[]> mapped = new ArrayList<>();
218+
219+
for (Object array : collectionValue) {
220+
int length = Array.getLength(array);
221+
Object[] mappedArray = new Object[length];
222+
223+
for (int i = 0; i < length; i++) {
224+
Object element = Array.get(array, i);
225+
JdbcValue elementJdbcValue = converter.writeJdbcValue(element, arrayElementType, parameter.getActualSqlType());
226+
227+
mappedArray[i] = elementJdbcValue.getValue();
228+
}
229+
mapped.add(mappedArray);
220230
}
231+
jdbcValue = JdbcValue.of(mapped, JDBCType.OTHER);
221232

222-
mapped.add(elementJdbcValue.getValue());
223-
}
233+
} else {
234+
List<Object> mapped = new ArrayList<>();
235+
SQLType jdbcType = null;
224236

225-
jdbcValue = JdbcValue.of(mapped, jdbcType);
237+
TypeInformation<?> actualType = typeInformation.getRequiredActualType();
238+
for (Object o : collectionValue) {
239+
JdbcValue elementJdbcValue = converter.writeJdbcValue(o, actualType, parameter.getActualSqlType());
240+
if (jdbcType == null) {
241+
jdbcType = elementJdbcValue.getJdbcType();
242+
}
243+
244+
mapped.add(elementJdbcValue.getValue());
245+
}
246+
247+
jdbcValue = JdbcValue.of(mapped, jdbcType);
248+
}
226249
} else {
227250

228251
SQLType sqlType = parameter.getSqlType();

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,19 @@ void queryByListOfTuples() {
340340
.containsExactly(tuples);
341341
}
342342

343+
@Test // GH-1323
344+
void queryByListOfConvertableTuples() {
345+
346+
SqlParameterSource parameterSource = forMethod("findByListOfTuples", List.class) //
347+
.withCustomConverters(DirectionToIntegerConverter.INSTANCE) //
348+
.withArguments(Arrays.asList(new Object[]{Direction.LEFT, "Einstein"}, new Object[]{Direction.RIGHT, "Feynman"}))
349+
.extractParameterSource();
350+
351+
assertThat(parameterSource.getValue("tuples"))
352+
.asInstanceOf(LIST)
353+
.containsExactly(new Object[][]{new Object[]{-1, "Einstein"}, new Object[]{1, "Feynman"}});
354+
}
355+
343356
QueryFixture forMethod(String name, Class... paramTypes) {
344357
return new QueryFixture(createMethod(name, paramTypes));
345358
}

0 commit comments

Comments
 (0)