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 bc2ae187f..5ee020c50 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; @@ -47,6 +50,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; @@ -275,4 +292,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 da2a976f6..decb9444e 100644 --- a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java @@ -1214,6 +1214,7 @@ public class UserRepositoryTests { List result = repository.findByBinaryData(data); assertThat(result, hasSize(1)); assertThat(result, hasItem(firstUser)); + assertThat(result.get(0).getBinaryData(), is(data)); } /** @@ -1279,6 +1280,24 @@ public class UserRepositoryTests { assertThat(result, hasSize(2)); assertThat(result, hasItems(firstUser, secondUser)); } + + /** + * @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) { 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 4846d2e0f..956a9ac9a 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 @@ -311,4 +311,11 @@ public interface UserRepository extends JpaRepository, JpaSpecifi * @see DATAJPA-496 */ List findByAttributesIn(Set attributes); + + /** + * @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); }