diff --git a/src/main/java/org/springframework/data/jpa/repository/Query.java b/src/main/java/org/springframework/data/jpa/repository/Query.java index f56d1228a..ccce385b1 100644 --- a/src/main/java/org/springframework/data/jpa/repository/Query.java +++ b/src/main/java/org/springframework/data/jpa/repository/Query.java @@ -46,4 +46,10 @@ public @interface Query { * Configures whether the given query is a native one. Defaults to {@literal false}. */ boolean nativeQuery() default false; + + /** + * The named query to be used. If not defined, a NamedQuery with name of {@code $ domainClass}.${finderMethodName}} + * will be used. + */ + String name() default ""; } 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 21e91cb8f..7ccad43b8 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 @@ -158,6 +158,17 @@ public class JpaQueryMethod extends QueryMethod { return getAnnotationValue("nativeQuery", Boolean.class).booleanValue(); } + /* + * (non-Javadoc) + * @see org.springframework.data.repository.query.QueryMethod#getNamedQueryName() + */ + @Override + public String getNamedQueryName() { + + String annotatedName = getAnnotationValue("name", String.class); + return StringUtils.hasText(annotatedName) ? annotatedName : super.getNamedQueryName(); + } + /** * Returns whether we should clear automatically for modifying queries. * diff --git a/src/test/java/org/springframework/data/jpa/repository/query/JpaQueryMethodUnitTests.java b/src/test/java/org/springframework/data/jpa/repository/query/JpaQueryMethodUnitTests.java index d60e96479..1fbe51430 100644 --- a/src/test/java/org/springframework/data/jpa/repository/query/JpaQueryMethodUnitTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/query/JpaQueryMethodUnitTests.java @@ -56,7 +56,7 @@ public class JpaQueryMethodUnitTests { RepositoryMetadata metadata; Method repositoryMethod, invalidReturnType, pageableAndSort, pageableTwice, sortableTwice, modifyingMethod, - nativeQuery; + nativeQuery, namedQuery; /** * @throws Exception @@ -74,6 +74,7 @@ public class JpaQueryMethodUnitTests { modifyingMethod = UserRepository.class.getMethod("renameAllUsersTo", String.class); nativeQuery = InvalidRepository.class.getMethod("findByLastname", String.class); + namedQuery = InvalidRepository.class.getMethod("findByNamedQuery"); } @Test @@ -204,6 +205,15 @@ public class JpaQueryMethodUnitTests { assertThat(method.isNativeQuery(), is(true)); } + /** + * @see DATAJPA-129 + */ + @Test + public void considersAnnotatedNamedQueryName() { + JpaQueryMethod queryMethod = new JpaQueryMethod(namedQuery, metadata, extractor); + assertThat(queryMethod.getNamedQueryName(), is("Foo.bar")); + } + /** * Interface to define invalid repository methods for testing. * @@ -237,5 +247,8 @@ public class JpaQueryMethodUnitTests { @Query(value = "query", nativeQuery = true) List findByLastname(String lastname); + + @Query(name = "Foo.bar") + List findByNamedQuery(); } }