Я нашел себе путь.
Трюк может быть сделано с помощью QueryDSL, следующим образом:
Во-первых, добавить зависимости QueryDSL:
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-mongodb</artifactId>
<version>${querydsl-mongo.version}</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl-mongo.version}</version>
</dependency>
Затем настроить плагин для создания классов метамодели (их имена будут такими же, из документов с буквой Q как префикс: например QUser
).
<build>
<plugins>
....
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Обратите внимание на класс процессора: это не QueryDSL по умолчанию один com.mysema.query.apt.morphia.MorphiaAnnotationProcessor, но Spring Data MongoDB один org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor
: Монго
Spring Data обеспечивает пользовательский процессор APT для генерации метамоделейвместо того, который предоставлен в QueryDSL, он сканирует 10 Spring специфический @Document вместо специфических аннотаций Morphia.
Теперь мы можем сделать наш репозиторий интерфейс расширения QueryDslPredicateExecutor<T>
:
public interface UserRepository extends MongoRepository<User, String>, QueryDslPredicateExecutor<User>,
QuerydslBinderCustomizer<QUser> {
}
Теперь мы можем определить Предикаты при запросе хранилищу:
QUser user = QUser.user;
BooleanExpression predicate = user.name.containsIgnoreCase("John");
userRepository.findAll(predicate);
QuerydslBinderCustomizer
помогает вам определить связывание документа свойства (см. Spring documentation для дальнейшей помощи).