14

Spring Data MongoDB リポジトリのJPA 仕様のようなものはありますか?

そうでない場合、リポジトリを使用して動的クエリを作成するにはどうすればよいですか?

古典的なシナリオは、ユーザーが入力するオプションのフィールドを持つ検索フォームです。

4

2 に答える 2

13

私は自分の道を見つけました。

このトリックは、次の方法で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 クラスを作成するためにプラグインを構成します (それらの名前は、プレフィックスとして文字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 は、QueryDSL で提供されるものではなく、メタモデルを生成するカスタム APT プロセッサを提供します。これは、Morphia 固有のアノテーションではなく、Spring 固有の @Document をスキャンします。

これで、リポジトリ インターフェイスを次のように拡張できます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 のドキュメントを参照してください)。

于 2015-11-20T16:12:41.910 に答える
1

これは次の時点での更新です。

<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>
于 2016-11-30T14:54:25.173 に答える