Spring Data nos ofrece distintas formas de ejecutar sentencias contra nuestra base de datos:
- Mediante nombre de función en la interfaz de repositorio.
- Uso de @Query
- MongoOperations
- Criteria
- Usando la sintaxis tal cual de la mongo shell
- Query By Example
- …
En este post nos vamos a centrar en la extensión Querydsl ampliando el código de la receta básica de Pivotal para MongoDB «Accessing Data with MongoDB»
1: pom.xml
Añadimos dependencia y configuramos plugin para generar las clases Q* (apt.version vale 1.1.3):
<dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-mongodb</artifactId> <exclusions> <exclusion> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> </exclusion> </exclusions> </dependency> ... <plugin> <groupId>com.mysema.maven</groupId> <artifactId>apt-maven-plugin</artifactId> <version>${apt.version}</version> <dependencies> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>${querydsl.version}</version> </dependency> </dependencies> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources/annotations</outputDirectory> <processor>org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor</processor> <logOnlyOnError>true</logOnlyOnError> </configuration> </execution> </executions> </plugin>
2: Documento
Anotamos la clase Customer con @Document
3: Repositorio
Hacemos que la interfaz CustomerRepository herede también de QueryDslPredicateExecutor<Customer>
4: Uso de Querydsl
// fetch an individual customer System.out.println("Customer found with findByFirstName('Alice') with querydsl:"); System.out.println("--------------------------------"); QCustomer qCustomer = QCustomer.customer; Predicate predicate = qCustomer.firstName.eq("Alice"); System.out.println(repository.findAll(predicate)); System.out.println();
Todo el código fuente está disponible en: https://github.com/venosov/gs-accessing-data-mongodb/commit/770df5f70853e9fe14bf4ada9c3c31eb5d4a4c8f