Репозиторий Spring Data MongoDB - спецификации JPA, такие как

Есть ли что-то вроде спецификаций JPA для репозиториев Spring Data MongoDB?

Если нет, как мне делать динамические запросы с репозиториями?

Классическим сценарием может быть форма поиска с дополнительными полями, которые пользователь может заполнить.


person s1moner3d    schedule 16.11.2015    source источник


Ответы (2)


Я нашел способ.

Уловку можно сделать с помощью 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 предоставляет собственный 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 документация для получения дополнительной помощи).

person s1moner3d    schedule 20.11.2015
comment
Для реализации этого, а также для реактивной версии есть пример: github.com/spring-projects/spring-data-examples/tree/master/ - person stilgar; 06.04.2020

Это обновление от:

<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>
person Slav    schedule 30.11.2016