有没有类似于JPA规范的Spring Data MongoDB仓库?如果没有,我该如何使用存储库进行动态查询?一个经典场景可能是一个带有可选字段的搜索表单,用户将填写这些字段。
我找到了一种方法。
可以使用以下方法通过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>