diff --git a/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryMethod.java b/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryMethod.java index 0342e786e..158a0e10c 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryMethod.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryMethod.java @@ -20,7 +20,10 @@ import static org.springframework.core.annotation.AnnotationUtils.*; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; import javax.persistence.LockModeType; import javax.persistence.QueryHint; @@ -48,6 +51,20 @@ import org.springframework.util.StringUtils; */ public class JpaQueryMethod extends QueryMethod { + // @see JPA 2.0 Specification 2.2 Persistent Fields and Properties Page 23 - Top paragraph. + private static final Set> NATIVE_ARRAY_TYPES; + + static { + + Set> types = new HashSet>(4); + types.add(byte[].class); + types.add(Byte[].class); + types.add(char[].class); + types.add(Character[].class); + + NATIVE_ARRAY_TYPES = Collections.unmodifiableSet(types); + } + private final QueryExtractor extractor; private final Method method; @@ -288,4 +305,13 @@ public class JpaQueryMethod extends QueryMethod { public JpaParameters getParameters() { return (JpaParameters) super.getParameters(); } + + /* + * (non-Javadoc) + * @see org.springframework.data.repository.query.QueryMethod#isCollectionQuery() + */ + @Override + public boolean isCollectionQuery() { + return super.isCollectionQuery() && !NATIVE_ARRAY_TYPES.contains(method.getReturnType()); + } } diff --git a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java index a280c7b35..0cdacb131 100644 --- a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java @@ -1215,6 +1215,7 @@ public class UserRepositoryTests { List result = repository.findByBinaryData(data); assertThat(result, hasSize(1)); assertThat(result, hasItem(firstUser)); + assertThat(result.get(0).getBinaryData(), is(data)); } /** @@ -1356,6 +1357,24 @@ public class UserRepositoryTests { assertThat(repository.deleteByLastname("dorfuaeB"), empty()); } + /** + * @see DATAJPA-505 + * @see https://issues.apache.org/jira/browse/OPENJPA-2484 + */ + @Test + @Ignore + public void findBinaryDataByIdJpaQl() throws Exception { + + byte[] data = "Woho!!".getBytes("UTF-8"); + firstUser.setBinaryData(data); + + flushTestUsers(); + + byte[] result = null; // repository.findBinaryDataByIdJpaQl(firstUser.getId()); + assertThat(result.length, is(data.length)); + assertThat(result, is(data)); + } + private Page executeSpecWithSort(Sort sort) { flushTestUsers(); diff --git a/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java b/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java index efe06cb46..904021569 100644 --- a/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java +++ b/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java @@ -327,4 +327,11 @@ public interface UserRepository extends JpaRepository, JpaSpecifi * @see DATAJPA-460 */ List deleteByLastname(String lastname); + + /** + * @see DATAJPA-505 + * @see https://issues.apache.org/jira/browse/OPENJPA-2484 + */ + // @Query(value = "select u.binaryData from User u where u.id = :id") + // byte[] findBinaryDataByIdJpaQl(@Param("id") Integer id); }