是否有类似Spring Data MongoDB Repositories 的JPA 规范?
如果没有,我如何使用存储库进行动态查询?
一个经典的场景可能是带有用户将填写的可选字段的搜索表单。
是否有类似Spring Data MongoDB Repositories 的JPA 规范?
如果没有,我如何使用存储库进行动态查询?
一个经典的场景可能是带有用户将填写的可选字段的搜索表单。
我找到了自己的方法。
这个技巧可以使用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 处理器来生成 Metamodels 而不是 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>