diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/AbstractJpaQuery.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/AbstractJpaQuery.java index 70ec15d0e..7e70d350f 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/AbstractJpaQuery.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/AbstractJpaQuery.java @@ -314,18 +314,17 @@ public abstract class AbstractJpaQuery implements RepositoryQuery { @Override public Object convert(Object source) { - if (!(source instanceof Tuple)) { + if (!(source instanceof Tuple tuple)) { return source; } - Tuple tuple = (Tuple) source; List> elements = tuple.getElements(); if (elements.size() == 1) { Object value = tuple.get(elements.get(0)); - if (type.isInstance(value) || value == null) { + if (type.getDomainType().isInstance(value) || type.isInstance(value) || value == null) { return value; } } diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryFinderTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryFinderTests.java index 36715fa12..af60a66af 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryFinderTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryFinderTests.java @@ -39,6 +39,8 @@ import org.springframework.data.jpa.domain.sample.User; import org.springframework.data.jpa.provider.PersistenceProvider; import org.springframework.data.jpa.repository.sample.RoleRepository; import org.springframework.data.jpa.repository.sample.UserRepository; +import org.springframework.data.jpa.repository.sample.UserRepository.IdOnly; +import org.springframework.data.jpa.repository.sample.UserRepository.RolesAndFirstname; import org.springframework.data.repository.query.QueryLookupStrategy; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -276,11 +278,28 @@ public class UserRepositoryFinderTests { .containsExactlyInAnyOrder(dave, oliver); } - @Test // DATAJPA-974 + @Test // DATAJPA-974, GH-2815 void executesQueryWithProjectionContainingReferenceToPluralAttribute() { - assertThat(userRepository.findRolesAndFirstnameBy()) // + List rolesAndFirstnameBy = userRepository.findRolesAndFirstnameBy(); + + assertThat(rolesAndFirstnameBy) .isNotNull(); + + for (RolesAndFirstname rolesAndFirstname : rolesAndFirstnameBy) { + assertThat(rolesAndFirstname.getFirstname()).isNotNull(); + assertThat(rolesAndFirstname.getRoles()).isNotNull(); + } + } + + @Test // GH-2815 + void executesQueryWithProjectionThroughStringQuery() { + + List ids = userRepository.findIdOnly(); + + assertThat(ids).isNotNull(); + + assertThat(ids).extracting(IdOnly::getId).doesNotContainNull(); } @Test // DATAJPA-1023, DATACMNS-959 diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java index ed5fcdbac..a91605edc 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java @@ -551,6 +551,9 @@ public interface UserRepository extends JpaRepository, JpaSpecifi List findRolesAndFirstnameBy(); + @Query(value = "FROM User u") + List findIdOnly(); + // DATAJPA-1172 @Query("select u from User u where u.age = :age") List findByStringAge(@Param("age") String age); @@ -721,4 +724,8 @@ public interface UserRepository extends JpaRepository, JpaSpecifi interface EmailOnly { String getEmailAddress(); } + + interface IdOnly { + int getId(); + } }