JPQL, o Java Persistent Query Language, es un lenguaje que se utiliza para realizar consultas sobre una base de datos desde las Entities en vez de las tablas tradicionales. Esto permite trabajar de manera más intuitiva para los desarrolladores en Java, ya que se utilizan atributos de objetos en lugar de columnas y tablas.
¿Cómo crear un CustomerRepository?
Para manejar la información de los clientes almacenada en la base de datos, primero necesitamos crear un repositorio. Vamos a seguir estos pasos:
Crear un CustomerRepository que extiende de ListCloudRepository.
Utilizar la CustomerEntity para definir el tipo de la clave primaria, que en este caso es un String.
Implementar un método para realizar consultas usando JPQL.
publicinterfaceCustomerRepositoryextendsListCloudRepository<CustomerEntity,String>{@Query("SELECT c FROM CustomerEntity c WHERE c.fundNumber = :fund")CustomerEntityfindByFund(@Param("fund")String fund);}
¿Cómo configurar el servicio de clientes?
Una vez definido el repository, es fundamental crear un servicio que lo integre y lo use para gestionar la lógica de negocio relacionada con la consulta de clientes:
Inyectar CustomerRepository en CustomerService.
Habilitar la inyección de dependencias con la anotación @Service.
Implementar el método findByFund que va a recibir un teléfono y utilizar el repository para la consulta.
Ya listo el controlador, es el momento de poner la aplicación en ejecución y probar el endpoint creado. Al realizar una solicitud GET a /api/customers/fund/{phone}, se espera recibir toda la información del cliente asociado al número de teléfono proporcionado. Si todo se ha hecho de manera correcta, la API responderá con estado 200 y los detalles del usuario.
JPQL muestra su fortaleza en su facilidad de uso al trabajar con OOP y su similitud en sintaxis con SQL estándar. Sin embargo, es importante considerar que SQL nativo ofrece características avanzadas no disponibles en JPQL, lo que podría ser un aspecto a explorar en clases futuras para ampliar nuestras habilidades de consulta. ¡Sigue explorando y potenciando tus habilidades en desarrollo con Java y consulta de bases de datos!
Bajo estos ejemplos esta "bien" pero en un ambiente productivo en donde lo mas seguro es que vayas a escribir validaciones, no queremos llamar a la base de datos tantas veces como validaciones tengamos. Lo recomendado es:
De esta forma solo hacemos un llamado a la base de datos y podemos hacer cuantas validaciones queramos sin afectar el rendimiento de nuestra app
Es buena practica terminar el nombre del metodo con el tipo de sentencia si es SQL O JPQL, y @Query(), admite otro parametro nativeQuery que recibe un valor boolean, para indicarle si es true estamos usando SQL y false PQL
@Query(nativeQuery =false, value ="SELECT e "+"FROM EmployeeEntity e, DepartmentEntity d, JobEntity j, LocationEntity l, CountryEntity c, RegionEntity r "+"WHERE e.jobEntity.jobId = j.jobId "+"AND e.depEntity.departmentId = d.departmentId "+"AND d.locationEntity.locationId = l.locationId "+"AND l.countryEntity.id = c.id "+"AND c.region.id = r.id "+"AND e.salary > :salary "+"AND e.commissionPct IS NOT NULL "+"ORDER BY salary ASC ")publicList<EmployeeEntity>searchInTablesJpql(@Param("salary")Double salary);
Excelente dato a tener en cuenta. Muchas gracias compañero 👍
Si alguno esta teniendo algun error con la consulta al momento de consumir el servicio de getByPhone con alguna otra herramienta, tengan en cuenta que en el request deben representar los espacios en el numero de telefono con el caracter especial "%20" que representa un espacio, quedando la consulta de esta forma:
Si solo quiero proyectar algunas columnas de mi tabla con JPQL una manera es creando un constructor en el entity, con solo los atributos que quiera proyectar, y en el query en la parte donde se especifica las columnas crear una instancia del constructor de la clase
@Query(nativeQuery =false, value ="SELECT new ParamEntity(p.id, p.name, p.value) "+"FROM ParamEntity p "+"WHERE p.parentId = (SELECT parent.id FROM ParamEntity parent where parent.name = :name ) "+"AND p.status = :status "+"ORDER BY p.name ASC ")publicList<ParamEntity>findChildsOfParentId(@Param("name")String id, @Param("status")Integer status);
Como hace el profe para que el ide le sugiera las palabras en el JPQL, yo escribo lo mismo en intellij idea pero solo me sale como un String cualquiera
hola, tento entendido por comentarios en otras clases que es por que usa el intellij idea ultimate, y ese es uno de sus beneficios, perooo! puedo estar equivocado ya que es algo que lei en comentarios! a mi me dieron el mes gratis de prueba y me funciona como al profesor generalmente