Spring 数据 MongoDB 存储库 - JPA 规范,例如
Spring Data MongoDB Repository - JPA Specifications like
Spring 数据 MongoDB 存储库是否有类似 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>
然后,配置插件以创建 Metamodels classes(它们的名称与 documents 相同,字母 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>
注意处理器class:它不是QueryDSL默认的com.mysema.query.apt.morphia.MorphiaAnnotationProcessor,而是Spring数据MongoDB org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor
:
Spring Data Mongo provides a custom APT processor to generate the
Metamodels instead of the one provided in QueryDSL, it will scan the
Spring specific @Document instead of the Morphia specific annotations.
现在我们可以让我们的存储库接口扩展 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 以获得更多帮助)。
这是更新于:
<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>
Spring 数据 MongoDB 存储库是否有类似 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>
然后,配置插件以创建 Metamodels classes(它们的名称与 documents 相同,字母 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>
注意处理器class:它不是QueryDSL默认的com.mysema.query.apt.morphia.MorphiaAnnotationProcessor,而是Spring数据MongoDB org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor
:
Spring Data Mongo provides a custom APT processor to generate the Metamodels instead of the one provided in QueryDSL, it will scan the Spring specific @Document instead of the Morphia specific annotations.
现在我们可以让我们的存储库接口扩展 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 以获得更多帮助)。
这是更新于:
<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>