Spring Boot

SpringBoot

Tutorial SpringBoot: API Query By Example (QBE)

Spring Boot query by example QBE: uso. Aprende a utilizar query by example en Spring Boot con ejemplos prácticos y detallados.

Introducción

Spring Data JPA es un subproyecto de Spring Data que tiene como objetivo simplificar el acceso a datos en aplicaciones que usan tecnología de persistencia de datos.

Uno de sus aspectos más notables es Query By Example (QBE), una técnica de consulta de usuario fácil de usar que permite crear una consulta dinámica a partir de una entidad de instancia de ejemplo.

La técnica QBE funciona definiendo una instancia de objeto de una entidad, en la que los campos no nulos se utilizan para determinar los predicados de consulta. Con QBE, se puede crear una consulta dinámica utilizando las instancias de la entidad.

Para usar QBE en Spring, se necesita hacer uso del ExampleMatcher y Example.

Configuración de QBE en Spring

Primero, debe configurarse la interfaz de repositorio para usar QBE.

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;

public interface UserRepository extends JpaRepository<User, Long>, QueryByExampleExecutor<User> {
}

Aquí, QueryByExampleExecutor es una interfaz de Spring Data que se puede extender para obtener funcionalidades QBE.

Uso básico de QBE

Un ejemplo simple de cómo usar QBE:

User user = new User();
user.setEmail("user@example.com");

Example<User> example = Example.of(user);

List<User> results = userRepository.findAll(example);

En este caso, se crea una nueva instancia de User y se establece el campo email. Luego, se usa este objeto User para crear un Example que se puede pasar al método findAll del repositorio. Este método devolverá todos los usuarios cuyos emails coincidan con "user@example.com".

Uso básico de QBE con múltiples campos

Si se tienen múltiples campos configurados en el objeto de muestra, todos se usarán en la consulta. Por ejemplo, supóngase una entidad User que tiene los campos firstName, lastName y email. Si se configuran todos estos campos en el objeto de muestra, la consulta resultante buscará usuarios que coincidan con todos estos campos.

User user = new User();
user.setFirstName("John");
user.setLastName("Doe");
user.setEmail("john.doe@example.com");

Example<User> example = Example.of(user);

List<User> results = userRepository.findAll(example);

En este caso, findAll(example) buscará usuarios cuyo firstName sea "John", cuyo lastName sea "Doe" y cuyo email sea "john.doe@example.com". Si un usuario coincide con todos estos campos, se incluirá en los resultados; si no coincide en uno o más campos, no se incluirá.

Uso avanzado de QBE

QBE también admite operaciones más complejas mediante el uso de un ExampleMatcher.

User user = new User();
user.setEmail("user");

ExampleMatcher matcher = ExampleMatcher.matching()
  .withMatcher("email", match -> match.startsWith())
  .withIgnorePaths("status");

Example<User> example = Example.of(user, matcher);

List<User> results = userRepository.findAll(example);

En este ejemplo, se ha configurado el ExampleMatcher para que el campo email haga coincidir al comienzo (startsWith), por lo que buscará usuarios cuyos emails comiencen con "user". También se ha configurado el ExampleMatcher para ignorar el campo status al realizar la coincidencia.

El objeto ExampleMatcher se puede utilizar para personalizar la forma en que se realizan las coincidencias en la consulta. Por defecto, todos los campos se comparan utilizando un igual estricto (equals). Sin embargo, puede cambiarse este comportamiento utilizando diferentes métodos en ExampleMatcher.

Hay dos formas de definir matchers en ExampleMatcher. Puede usarse una lambda como en match -> match.startsWith(), o puede usarse uno de los métodos estáticos en ExampleMatcher.GenericPropertyMatchers.

// Usando lambda
ExampleMatcher matcher1 = ExampleMatcher.matching()
  .withMatcher("email", match -> match.startsWith());

// Usando método estático
ExampleMatcher matcher2 = ExampleMatcher.matching()
  .withMatcher("email", ExampleMatcher.GenericPropertyMatchers.startsWith());

Ambos códigos hacen exactamente lo mismo: configuran el matcher para que el campo email en la consulta se haga coincidir al inicio. La diferencia es puramente sintáctica y puedes usarse cualquiera.

Creación de Queries personalizadas con QBE

QBE también permite la creación de consultas más personalizadas, según los diferentes tipos de condiciones que pueden necesitarse. Spring proporciona una serie de métodos que se pueden utilizar para personalizar las consultas, y estos pueden ser útiles para crear consultas más detalladas y precisas.

Configurando Matchers para campos específicos

ExampleMatcher proporciona métodos como withMatcher() que permiten configurar las coincidencias en los campos de la entidad. En el siguiente ejemplo, el método endsWith() se utiliza para hacer que el campo de email haga coincidir al final.

User user = new User();
user.setEmail("example.com");

ExampleMatcher matcher = ExampleMatcher.matching()
  .withMatcher("email", ExampleMatcher.GenericPropertyMatchers.endsWith());

Example<User> example = Example.of(user, matcher);

List<User> results = userRepository.findAll(example);

Aquí, findAll() devolverá todos los usuarios cuyos emails terminen en "example.com".

Ignorar la distinción entre mayúsculas y minúsculas

A veces, es posible que no desee distinguir entre mayúsculas y minúsculas al hacer coincidir. Se puede usar el método withIgnoreCase() para lograr esto.

User user = new User();
user.setEmail("USER");

ExampleMatcher matcher = ExampleMatcher.matching()
  .withIgnoreCase()
  .withMatcher("email", ExampleMatcher.GenericPropertyMatchers.startsWith());

Example<User> example = Example.of(user, matcher);

List<User> results = userRepository.findAll(example);

Aquí, findAll() devolverá todos los usuarios cuyos emails comiencen con "USER", sin tener en cuenta las mayúsculas y minúsculas.

Configuración de las propiedades a ignorar

El método withIgnorePaths() se puede utilizar para ignorar propiedades específicas durante la coincidencia. Esto puede ser útil si hay campos que no deben tenerse en cuenta en la consulta.

User user = new User();
user.setEmail("user@example.com");
user.setFirstName("John");

ExampleMatcher matcher = ExampleMatcher.matching()
  .withIgnorePaths("firstName");

Example<User> example = Example.of(user, matcher);

List<User> results = userRepository.findAll(example);

En este caso, la propiedad firstName se ignora durante la coincidencia, por lo que findAll() devolverá todos los usuarios con el email "user@example.com", independientemente de su firstName.

Estas son solo algunas de las muchas formas en las que QBE puede personalizarse para crear consultas más detalladas y precisas. Es una herramienta muy poderosa en Spring Data JPA que puede ayudar a simplificar y mejorar el proceso de consulta de datos.

Certifícate en SpringBoot con CertiDevs PLUS

Ejercicios de esta lección API Query By Example (QBE)

Evalúa tus conocimientos de esta lección API Query By Example (QBE) con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Web y Test Starters

Spring Boot
Puzzle

Entidades JPA

Spring Boot
Test

Repositorios reactivos

Spring Boot
Test

Inserción de datos

Spring Boot
Test

Borrar datos de base de datos

Spring Boot
Test

Controladores Spring MVC

Spring Boot
Código

Backend API REST con Spring Boot

Spring Boot
Proyecto

Operadores Reactivos

Spring Boot
Puzzle

Controladores Spring REST

Spring Boot
Código

Uso de Spring con Thymeleaf

Spring Boot
Puzzle

Crear entidades JPA

Spring Boot
Código

Registro de usuarios

Spring Boot
Test

CRUD y JPA Repository

Spring Boot
Puzzle

Anotaciones y mapeo en JPA

Spring Boot
Puzzle

Integración con Vue

Spring Boot
Test

Consultas JPQL con @Query en Spring Data JPA

Spring Boot
Test

Open API y cómo agregarlo en Spring Boot

Spring Boot
Puzzle

Uso de Controladores REST

Spring Boot
Puzzle

API Specification

Spring Boot
Puzzle

Inyección de dependencias

Spring Boot
Test

Introducción a Spring Boot

Spring Boot
Test

Consultas JPQL con @Query en Spring Data JPA

Spring Boot
Puzzle

API Query By Example (QBE)

Spring Boot
Puzzle

Inyección de dependencias

Spring Boot
Código

Vista en Spring MVC con Thymeleaf

Spring Boot
Test

Servicios en Spring

Spring Boot
Código

Configuración de Vue

Spring Boot
Puzzle

Integración con Angular

Spring Boot
Test

API Query By Example (QBE)

Spring Boot
Test

API Specification

Spring Boot
Test

Controladores MVC

Spring Boot
Test

Métodos find en repositorios

Spring Boot
Test

Repositorios Spring Data

Spring Boot
Test

Inyección de dependencias

Spring Boot
Puzzle

Data JPA y Mail Starters

Spring Boot
Test

Configuración de Angular

Spring Boot
Puzzle

Controladores Spring REST

Spring Boot
Test

Configuración de Controladores MVC

Spring Boot
Puzzle

Asociaciones de entidades JPA

Spring Boot
Código

Actualizar datos de base de datos

Spring Boot
Test

Identificadores y relaciones JPA

Spring Boot
Puzzle

Verificar token JWT en peticiones

Spring Boot
Test

Login de usuarios

Spring Boot
Test

Integración con React

Spring Boot
Test

Configuración de React

Spring Boot
Puzzle

Asociaciones en JPA

Spring Boot
Test

Consultas JPQL

Spring Boot
Código

Todas las lecciones de SpringBoot

Accede a todas las lecciones de SpringBoot y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Spring Boot

Spring Boot

Introducción Y Entorno

Spring Boot Starters

Spring Boot

Introducción Y Entorno

Inyección De Dependencias

Spring Boot

Introducción Y Entorno

Controladores Spring Mvc

Spring Boot

Spring Web

Vista En Spring Mvc Con Thymeleaf

Spring Boot

Spring Web

Controladores Spring Rest

Spring Boot

Spring Web

Open Api Y Cómo Agregarlo En Spring Boot

Spring Boot

Spring Web

Servicios En Spring

Spring Boot

Spring Web

Crear Entidades Jpa

Spring Boot

Persistencia Con Spring Data

Asociaciones De Entidades Jpa

Spring Boot

Persistencia Con Spring Data

Repositorios Spring Data

Spring Boot

Persistencia Con Spring Data

Métodos Find En Repositorios

Spring Boot

Persistencia Con Spring Data

Inserción De Datos

Spring Boot

Persistencia Con Spring Data

Actualizar Datos De Base De Datos

Spring Boot

Persistencia Con Spring Data

Borrar Datos De Base De Datos

Spring Boot

Persistencia Con Spring Data

Consultas Jpql Con @Query En Spring Data Jpa

Spring Boot

Persistencia Con Spring Data

Api Query By Example (Qbe)

Spring Boot

Persistencia Con Spring Data

Repositorios Reactivos

Spring Boot

Persistencia Con Spring Data

Api Specification

Spring Boot

Persistencia Con Spring Data

Integración Con React

Spring Boot

Integración Frontend

Integración Con Vue

Spring Boot

Integración Frontend

Integración Con Angular

Spring Boot

Integración Frontend

Registro De Usuarios

Spring Boot

Seguridad Con Spring Security

Login De Usuarios

Spring Boot

Seguridad Con Spring Security

Verificar Token Jwt En Peticiones

Spring Boot

Seguridad Con Spring Security

En esta lección

Objetivos de aprendizaje de esta lección

  1. Comprender qué es la API Query By Example (QBE) en Spring Data JPA y cómo se utiliza para crear consultas dinámicas.
  2. Aprender a configurar el ExampleMatcher y el Example para definir las condiciones de búsqueda en función del objeto de muestra.
  3. Conocer el uso básico de QBE con un solo campo y cómo combinar múltiples campos para crear consultas más detalladas.
  4. Explorar el uso avanzado de QBE con el ExampleMatcher para realizar operaciones más complejas, como coincidencias al inicio o ignorar distinción entre mayúsculas y minúsculas.