diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Hint.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Hint.java index 480b8085e..969d28ef2 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Hint.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/Hint.java @@ -26,7 +26,7 @@ import org.springframework.core.annotation.AliasFor; /** * Annotation to declare index hints for repository query, update and aggregate operations. The index is specified by * its name. - * + * * @author Christoph Strobl * @since 4.1 */ @@ -35,12 +35,18 @@ import org.springframework.core.annotation.AliasFor; @Documented public @interface Hint { + /** + * The name of the index to use. In case of an {@literal aggregation} the index is evaluated against the initial + * collection or view. + * + * @return the index name. + */ String value() default ""; /** * The name of the index to use. In case of an {@literal aggregation} the index is evaluated against the initial - * collection or view. Specify the index either by the index name. - * + * collection or view. + * * @return the index name. */ @AliasFor("value") diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java index e4a533b7d..151a3a2e6 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java @@ -235,9 +235,10 @@ public abstract class AbstractMongoQuery implements RepositoryQuery { */ Query applyHintIfPresent(Query query) { - if(!method.hasAnnotatedHint()) { + if (!method.hasAnnotatedHint()) { return query; } + return query.withHint(method.getAnnotatedHint()); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractReactiveMongoQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractReactiveMongoQuery.java index 85f92d918..fb430a151 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractReactiveMongoQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractReactiveMongoQuery.java @@ -279,9 +279,10 @@ public abstract class AbstractReactiveMongoQuery implements RepositoryQuery { */ Query applyHintIfPresent(Query query) { - if(!method.hasAnnotatedHint()) { + if (!method.hasAnnotatedHint()) { return query; } + return query.withHint(method.getAnnotatedHint()); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AggregationUtils.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AggregationUtils.java index d88655887..444be1351 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AggregationUtils.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AggregationUtils.java @@ -111,9 +111,10 @@ abstract class AggregationUtils { */ static AggregationOptions.Builder applyHint(AggregationOptions.Builder builder, MongoQueryMethod queryMethod) { - if(!queryMethod.hasAnnotatedHint()) { + if (!queryMethod.hasAnnotatedHint()) { return builder; } + return builder.hint(queryMethod.getAnnotatedHint()); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java index 8db045881..2f8ac7639 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java @@ -368,20 +368,19 @@ public class MongoQueryMethod extends QueryMethod { * @since 4.1 */ public boolean hasAnnotatedHint() { - return StringUtils.hasText(getAnnotatedHint()); + return doFindAnnotation(Hint.class).map(Hint::indexName).filter(StringUtils::hasText).isPresent(); } /** * Returns the aggregation pipeline declared via a {@link Hint} annotation. * - * @return the index name (might be empty) or {@literal null} if not present. + * @return the index name (might be empty). + * @throws IllegalStateException if the method is not annotated with {@link Hint} * @since 4.1 */ - @Nullable public String getAnnotatedHint() { - - Optional hint = doFindAnnotation(Hint.class); - return hint.map(Hint::indexName).orElse(null); + return doFindAnnotation(Hint.class).map(Hint::indexName).orElseThrow(() -> new IllegalStateException( + "Expected to find @Hint annotation but did not; Make sure to check hasAnnotatedHint() before.")); } private Optional findAnnotatedAggregation() { diff --git a/src/main/asciidoc/reference/mongo-repositories.adoc b/src/main/asciidoc/reference/mongo-repositories.adoc index 4090c8b8b..0cc0160bd 100644 --- a/src/main/asciidoc/reference/mongo-repositories.adoc +++ b/src/main/asciidoc/reference/mongo-repositories.adoc @@ -306,14 +306,15 @@ The `@Hint` annotation allows to override MongoDB's default index selection and ==== [source,java] ---- -@Hint("lastname-idx") <1> +@Hint("lastname-idx") <1> List findByLastname(String lastname); -@Query(value = "{ 'firstname' : ?0 }", hint="firstname-idx") <2> +@Query(value = "{ 'firstname' : ?0 }", hint = "firstname-idx") <2> List findByFirstname(String firstname); ---- + <1> Use the index with name `lastname-idx`. -<2> The `@Query` annotation defines the `hint` alias which is equivalent to explicitly adding the `@Hint` annotation. +<2> The `@Query` annotation defines the `hint` alias which is equivalent to adding the `@Hint` annotation. ==== [[mongodb.repositories.queries.update]]