Spring Data MongoDB存储库 - JPA规范之类的

s1m*_*r3d 3 spring dynamic-queries dynamicquery spring-data spring-data-mongodb

是否有像Spring Data MongoDB存储库的JPA规范

如果没有,我如何使用存储库进行动态查询

经典场景可以是具有用户将填充的可选字段的搜索表单.

s1m*_*r3d 7

我发现自己是一种方式.

可以使用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>
Run Code Online (Sandbox Code Playgroud)

然后,配置插件以创建Metamodels类(它们的名称将与字母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>
Run Code Online (Sandbox Code Playgroud)

注意处理器类:它不是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> {
}
Run Code Online (Sandbox Code Playgroud)

我们现在可以在查询存储库时定义谓词:

QUser user = QUser.user;            
BooleanExpression predicate = user.name.containsIgnoreCase("John");         
userRepository.findAll(predicate);
Run Code Online (Sandbox Code Playgroud)

QuerydslBinderCustomizer帮助您定义Document属性的绑定(有关更多帮助,请参阅Spring文档).