Spring Data MongoDB Repository - спецификации JPA, такие как
Есть ли что-то вроде спецификации JPA для репозиториев Spring Data MongoDB?
Если нет, как я могу делать динамические запросы с репозиториями?
Классическим сценарием может быть форма поиска с необязательными полями, которые будет заполнять пользователь.
2 ответа
Я нашел себе способ.
Трюк можно сделать с помощью 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 Mongo предоставляет пользовательский процессор APT для генерации метамоделей вместо того, который представлен в QueryDSL, он будет сканировать специфический для 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).
Это обновление от:
<spring.version>4.3.4.RELEASE</spring.version>
<querydsl.version>4.1.3</querydsl.version>
<spring.data.mongodb.version>1.9.5</spring.data.mongodb.version>
использование
...
<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>
...
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-mongodb</artifactId>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
</dependency>