En este tema, aprenderemos cómo utilizar los métodos de consulta en Spring Data JPA para interactuar con la base de datos de manera eficiente y sencilla. Los métodos de consulta nos permiten realizar operaciones de búsqueda y manipulación de datos sin necesidad de escribir consultas SQL manualmente.

Objetivos

  • Entender qué son los métodos de consulta en Spring Data JPA.
  • Aprender a definir métodos de consulta en los repositorios.
  • Conocer las diferentes formas de crear consultas: derivadas, JPQL y nativas.
  • Practicar con ejemplos y ejercicios.

  1. ¿Qué son los Métodos de Consulta en Spring Data JPA?

Spring Data JPA proporciona una forma de definir métodos de consulta directamente en los repositorios. Estos métodos pueden ser:

  • Consultas derivadas: Se generan automáticamente a partir del nombre del método.
  • Consultas JPQL: Se definen utilizando el lenguaje de consulta de Java Persistence (JPQL).
  • Consultas nativas: Se escriben directamente en SQL.

  1. Definiendo Métodos de Consulta en Repositorios

2.1 Consultas Derivadas

Las consultas derivadas se generan automáticamente a partir del nombre del método. Spring Data JPA analiza el nombre del método y crea la consulta correspondiente.

Ejemplo:

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByLastName(String lastName);
    User findByEmail(String email);
}

En este ejemplo:

  • findByLastName(String lastName): Busca todos los usuarios con el apellido especificado.
  • findByEmail(String email): Busca un usuario por su correo electrónico.

2.2 Consultas JPQL

JPQL (Java Persistence Query Language) es un lenguaje de consulta orientado a objetos similar a SQL, pero opera sobre entidades en lugar de tablas.

Ejemplo:

public interface UserRepository extends JpaRepository<User, Long> {
    @Query("SELECT u FROM User u WHERE u.lastName = :lastName")
    List<User> findUsersByLastName(@Param("lastName") String lastName);
}

En este ejemplo, la anotación @Query se utiliza para definir una consulta JPQL personalizada.

2.3 Consultas Nativas

Las consultas nativas se escriben directamente en SQL y se utilizan cuando se necesita una consulta específica que no se puede expresar fácilmente con JPQL.

Ejemplo:

public interface UserRepository extends JpaRepository<User, Long> {
    @Query(value = "SELECT * FROM users WHERE last_name = :lastName", nativeQuery = true)
    List<User> findUsersByLastNameNative(@Param("lastName") String lastName);
}

En este ejemplo, la consulta SQL se define directamente en la anotación @Query con el atributo nativeQuery establecido en true.

  1. Ejemplos Prácticos

3.1 Consultas Derivadas

Ejemplo:

public interface ProductRepository extends JpaRepository<Product, Long> {
    List<Product> findByCategory(String category);
    List<Product> findByPriceLessThan(Double price);
}

3.2 Consultas JPQL

Ejemplo:

public interface ProductRepository extends JpaRepository<Product, Long> {
    @Query("SELECT p FROM Product p WHERE p.category = :category")
    List<Product> findProductsByCategory(@Param("category") String category);

    @Query("SELECT p FROM Product p WHERE p.price < :price")
    List<Product> findProductsByPriceLessThan(@Param("price") Double price);
}

3.3 Consultas Nativas

Ejemplo:

public interface ProductRepository extends JpaRepository<Product, Long> {
    @Query(value = "SELECT * FROM products WHERE category = :category", nativeQuery = true)
    List<Product> findProductsByCategoryNative(@Param("category") String category);

    @Query(value = "SELECT * FROM products WHERE price < :price", nativeQuery = true)
    List<Product> findProductsByPriceLessThanNative(@Param("price") Double price);
}

  1. Ejercicios Prácticos

Ejercicio 1: Consultas Derivadas

Define un método en el repositorio OrderRepository para encontrar todas las órdenes realizadas por un cliente específico.

Solución:

public interface OrderRepository extends JpaRepository<Order, Long> {
    List<Order> findByCustomerId(Long customerId);
}

Ejercicio 2: Consultas JPQL

Define un método en el repositorio OrderRepository para encontrar todas las órdenes con un total mayor a un valor específico.

Solución:

public interface OrderRepository extends JpaRepository<Order, Long> {
    @Query("SELECT o FROM Order o WHERE o.total > :total")
    List<Order> findOrdersByTotalGreaterThan(@Param("total") Double total);
}

Ejercicio 3: Consultas Nativas

Define un método en el repositorio OrderRepository para encontrar todas las órdenes realizadas en una fecha específica utilizando una consulta nativa.

Solución:

public interface OrderRepository extends JpaRepository<Order, Long> {
    @Query(value = "SELECT * FROM orders WHERE order_date = :orderDate", nativeQuery = true)
    List<Order> findOrdersByOrderDateNative(@Param("orderDate") LocalDate orderDate);
}

  1. Resumen

En esta sección, hemos aprendido sobre los métodos de consulta en Spring Data JPA y cómo utilizarlos para interactuar con la base de datos. Hemos cubierto:

  • Consultas derivadas.
  • Consultas JPQL.
  • Consultas nativas.

Además, hemos practicado con ejemplos y ejercicios para reforzar los conceptos aprendidos. En el próximo módulo, exploraremos la seguridad en Spring Boot, comenzando con una introducción a Spring Security.

Curso de Spring Boot

Módulo 1: Introducción a Spring Boot

Módulo 2: Conceptos Básicos de Spring Boot

Módulo 3: Construyendo Servicios Web RESTful

Módulo 4: Acceso a Datos con Spring Boot

Módulo 5: Seguridad en Spring Boot

Módulo 6: Pruebas en Spring Boot

Módulo 7: Funciones Avanzadas de Spring Boot

Módulo 8: Despliegue de Aplicaciones Spring Boot

Módulo 9: Rendimiento y Monitoreo

Módulo 10: Mejores Prácticas y Consejos

© Copyright 2024. Todos los derechos reservados