Allow passing of tuples to repository query methods.
Closes #1323 Original pull request: #1838
This commit is contained in:
committed by
Mark Paluch
parent
23d91d62bb
commit
8241aa1222
@@ -117,9 +117,13 @@ public class JdbcRepositoryIntegrationTests {
|
||||
@Autowired WithDelimitedColumnRepository withDelimitedColumnRepository;
|
||||
|
||||
private static DummyEntity createDummyEntity() {
|
||||
return createDummyEntity("Entity Name");
|
||||
}
|
||||
|
||||
private static DummyEntity createDummyEntity(String entityName) {
|
||||
|
||||
DummyEntity entity = new DummyEntity();
|
||||
entity.setName("Entity Name");
|
||||
entity.setName(entityName);
|
||||
|
||||
return entity;
|
||||
}
|
||||
@@ -1334,6 +1338,21 @@ public class JdbcRepositoryIntegrationTests {
|
||||
assertThat(inDatabase.get().getIdentifier()).isEqualTo("UR-123");
|
||||
}
|
||||
|
||||
@Test // GH-1323
|
||||
void queryWithTupleIn() {
|
||||
|
||||
DummyEntity one = repository.save(createDummyEntity("one"));
|
||||
DummyEntity two = repository.save(createDummyEntity( "two"));
|
||||
DummyEntity three = repository.save(createDummyEntity( "three"));
|
||||
|
||||
List<Object[]> tuples = List.of(
|
||||
new Object[]{two.idProp, "two"}, // matches "two"
|
||||
new Object[]{three.idProp, "two"} // matches nothing
|
||||
);
|
||||
|
||||
repository.findByListInTuple(tuples);
|
||||
}
|
||||
|
||||
private Root createRoot(String namePrefix) {
|
||||
|
||||
return new Root(null, namePrefix,
|
||||
@@ -1461,6 +1480,9 @@ public class JdbcRepositoryIntegrationTests {
|
||||
Optional<DummyDto> findDtoByIdProp(Long idProp);
|
||||
|
||||
Optional<DummyAllArgsDto> findAllArgsDtoByIdProp(Long idProp);
|
||||
|
||||
@Query("SELECT * FROM DUMMY_ENTITY WHERE (ID_PROP, NAME) IN (:tuples)")
|
||||
List<DummyEntity> findByListInTuple(List<Object[]> tuples);
|
||||
}
|
||||
|
||||
interface RootRepository extends ListCrudRepository<Root, Long> {
|
||||
|
||||
@@ -22,6 +22,7 @@ import java.lang.reflect.Method;
|
||||
import java.sql.JDBCType;
|
||||
import java.sql.ResultSet;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
@@ -325,6 +326,33 @@ class StringBasedJdbcQueryUnitTests {
|
||||
assertThat(sqlParameterSource.getValue("value")).isEqualTo("one");
|
||||
}
|
||||
|
||||
@Test // GH-1323
|
||||
void queryByListOfTuples() {
|
||||
|
||||
String[][] tuples = {new String[]{"Albert", "Einstein"}, new String[]{"Richard", "Feynman"}};
|
||||
|
||||
SqlParameterSource parameterSource = forMethod("findByListOfTuples", List.class) //
|
||||
.withArguments(Arrays.asList(tuples))
|
||||
.extractParameterSource();
|
||||
|
||||
assertThat(parameterSource.getValue("tuples"))
|
||||
.asInstanceOf(LIST)
|
||||
.containsExactly(tuples);
|
||||
}
|
||||
|
||||
@Test // GH-1323
|
||||
void queryByListOfConvertableTuples() {
|
||||
|
||||
SqlParameterSource parameterSource = forMethod("findByListOfTuples", List.class) //
|
||||
.withCustomConverters(DirectionToIntegerConverter.INSTANCE) //
|
||||
.withArguments(Arrays.asList(new Object[]{Direction.LEFT, "Einstein"}, new Object[]{Direction.RIGHT, "Feynman"}))
|
||||
.extractParameterSource();
|
||||
|
||||
assertThat(parameterSource.getValue("tuples"))
|
||||
.asInstanceOf(LIST)
|
||||
.containsExactly(new Object[][]{new Object[]{-1, "Einstein"}, new Object[]{1, "Feynman"}});
|
||||
}
|
||||
|
||||
QueryFixture forMethod(String name, Class... paramTypes) {
|
||||
return new QueryFixture(createMethod(name, paramTypes));
|
||||
}
|
||||
@@ -450,6 +478,9 @@ class StringBasedJdbcQueryUnitTests {
|
||||
|
||||
@Query("SELECT * FROM person WHERE lastname = $1")
|
||||
Object unsupportedLimitQuery(@Param("lastname") String lastname, Limit limit);
|
||||
|
||||
@Query("select count(1) from person where (firstname, lastname) in (:tuples)")
|
||||
Object findByListOfTuples(@Param("tuples") List<Object[]> tuples);
|
||||
}
|
||||
|
||||
@Test // GH-619
|
||||
|
||||
Reference in New Issue
Block a user