Integrar QueryDSL con Spring Data JPA

QueryDSL es un librería de código abierto que nos permite crear y ejecutar consultar de manera segura y ágil además se puede utilizar con diferentes tecnologías como Hibernate, JDO, Lucene, JDBC y colecciones Java entre otros.

En este curso veremos como integrar QueryDSL en un proyecto Java creado con el IDE Netbeans 8.x y el framework Spring Data JPA sobre el proveedor Hibernate, aprenderemos como configurar las librerías y ejecutar consultas.

Para iniciar creamos el proyecto como lo hicimos en el tutorial Spring Data JPA con MySQL, luego localizamos el archivo POM.xml y editamos para agregar las dependencias requeridas por QueryDSL, son las siguientes:

<dependency>
   <groupId>com.mysema.querydsl</groupId>
   <artifactId>querydsl-apt</artifactId>
   <version>${querydsl.version}</version>
   <scope>provided</scope>
</dependency>

<dependency>
   <groupId>com.mysema.querydsl</groupId>
   <artifactId>querydsl-jpa</artifactId>
   <version>${querydsl.version}</version>
</dependency>


Lo siguiente será configurar el Maven APT Plugin, le indicamos al JPAAnnotationProcessor donde almacenar las clases auxiliares generadas.


<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>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
      </configuration>
      </execution>
  </executions>
</plugin>


Usaremos el proyecto creado en el tutorial Spring Data JPA como base, modificaremos el mismo para realizar las consultas con QueryDsl, modificamos la clase UsuarioRepository para que extienda de la clase QueryDslPredicateExecutor<T> donde T indica el tipo de la entidad, en este ejemplo Usuario, nuestro repositorio de usuarios quedará de este modo:


import java.util.List;
import org.springframework.data.querydsl.QueryDslPredicateExecutor;
import org.springframework.data.repository.CrudRepository;

public interface UsuarioRepository extends
        CrudRepository<Usuario, Long>,
        QueryDslPredicateExecutor<Usuario> {

    // Obtener una lista de usuarios con el apellido indicado
    List<Usuario> findByApellido(String apellido);

    // Obtener una lista de los usuarios con edad menor a la indicada
    List<Usuario> findByEdadLessThan(Integer edad);

}


Seguido modificaremos la clase principal para que ejecutar las consultas, aun podemos seguir utilizando los métodos anteriores de consulta que creamos en el tutorial anterior.

Si todo ha está correcto tendremos una clase llamado QUsuario generada automáticamente por la librería, al construir el proyecto se actualizara, tendremos una clase de estas por cada Entity que tengamos en el proyecto, podemos ver estas clases en la carpeta generated sources java.

Nuestra primera consulta: Obtener todos los usuario con apellidos que terminen en la letra “z”, primero obtener una instancia de QUsuario y aplicamos la función endsWith(“z”) sobre el campo apellido para indicarle que debe buscar todos los apellidos que terminen exactamente en la letra “z”, podemos por ejemplo utilizar endsWithIgnoreCase para buscar sin distinguir si es mayúscula o minúscula.


QUsuario usuario = QUsuario.usuario;
Predicate consulta = usuario.apellido.endsWith("z");
repository.findAll(consulta);


Podemos crear consultas mas complejas usando en operador AND o OR para mezclar los diferentes filtros y funciones que nos proporciona QueryDSL, veamos un ejemplo:


// Aplicar mas de un filtro usando (and)
// Busca los usuarios con edades entre 10 - 20 y con nombre terminado en "a"
Predicate consulta2 = usuario.edad.between(10, 20).and(usuario.nombre.endsWith("a"));
Iterable<Usuario> usrs2 = repository.findAll(consulta2);


Configurar Base de Datos PostgreSQL

Haremos una modificación al código para utilizar una base de datos PostgreSQL, igual podemos usar la base de datos MySQL y la configuración que hicimos en el tutorial Spring Data JPA con MySQL haremos el cambio solo por motivos didácticos.

El cambio es muy sencillo solo debemos cambiar los valores del archivo de propiedades application.properties, recordamos cambiar el puerto, nombre de la base de datos, nombre de usuario y contraseña, el servidor debe estar ejecutándose y la base de datos debe existir para que la aplicación funcione:


# Configurar la coneccion a la base de datos PostgreSQL
spring.datasource.url = jdbc:postgresql://localhost:PUERTO/BASE_DATOS
spring.datasource.username = USUARIO
spring.datasource.password = CONTRASENA
spring.datasource.driverClassName = org.postgresql.Driver

spring.jpa.database: POSTGRESQL
spring.jpa.hibernate.ddl-auto: create-drop


Además agregamos al archivo POM.xml las dependencias para PostgreSQL.


<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.4-1201-jdbc41</version>
    <scope>runtime</scope>
</dependency>


Hecho esto podemos ejecutar la aplicación y ver el resultado en la consola de salida.

Descargar Integrar QueryDSL con Spring Data JPA

Comentarios

  1. Muy bueno me esta sirviendo para iniciar con esta libreria...
    Para gradle estoy usando https://plugins.gradle.org/plugin/com.ewerk.gradle.plugins.querydsl
    Gracias...

    ResponderEliminar
  2. Hola.

    Muy buena introducción. La verdad es que no hay mucha info sobre querydsl.
    Estoy intentando hacer un simple selecto distinct por ejemplo contra el campo apellido pero no soy capaz. Sabrías como va el asunto.
    Salu2

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Conectar SQL Server con Java

Detección de rostros

Instalar OpenCV para Python en Windows