Ir al contenido principal

Entradas

Mostrando las entradas de febrero, 2025

Filtros dinámicos en JPA: Búsqueda por campos nulos y valores específicos

¿Alguna vez has necesitado implementar una búsqueda que maneje tanto valores específicos como campos nulos en tu base de datos? En este artículo te mostraré cómo hacerlo de manera elegante usando JPA y Spring Boot. El Escenario Imaginemos que tenemos una tabla de empleados ( Employee ) y queremos buscar por dos criterios: Departamento (que puede ser null) Salario (que también puede ser null) La Solución Aquí está la consulta JPA que resuelve este problema: SELECT e . * FROM Employee e WHERE ( ( : #{#filters.departmentId} IS NULL AND e.department_id IS NULL) OR ( : #{#filters.departmentId} IS NOT NULL AND e.department_id = :#{#filters.departmentId}) ) AND ( ( : #{#filters.salary} IS NULL AND e.salary IS NULL) OR ( : #{#filters.salary} IS NOT NULL AND e.salary >= :#{#filters.salary}) ) ¿Cómo funciona? Vamos a desglosarlo por partes: 1. Filtro por Departamento ( : #{#filters.departmentId} IS NULL AND e.department_id IS NULL) OR ( : #...

Sintaxis fácil de entender JAVA SQL/JPQL paso a paso

Desglose de consulta de JPQL para entender su sintaxis fácil, analicemos la siguiente consulta:  SELECT e . * FROM Employee e WHERE ( ( : #{#filters.departmentId} IS NULL -- ¿No se especificó departamento? AND e . department_id IS NULL -- ¿El empleado no tiene departamento? ) OR ( : #{#filters.departmentId} IS NOT NULL -- ¿Se especificó un departamento? AND e . department_id = : #{#filters.departmentId} -- ¿Coincide con el departamento del empleado? ) ) AND ( ( : #{#filters.salary} IS NULL -- ¿No se especificó salario? AND e . salary IS NULL -- ¿El empleado no tiene salario registrado? ) OR ( : #{#filters.salary} IS NOT NULL -- ¿Se especificó un salario? AND e . salary >= : #{#filters.salary} -- ¿El salario del empleado es mayor o igual? ) ) Dond...

Los Riesgos Ocultos de BeanUtils.copyProperties en Entidades JPA

  El Problema Muchos desarrolladores Java confían en BeanUtils.copyProperties() para mapear objetos de manera conveniente. Sin embargo, cuando se usa con entidades JPA, especialmente aquellas con campos de auditoría, esta conveniencia puede generar errores sutiles. Considera este escenario común: @EntityListeners ( AuditingEntityListener . class ) public abstract class AbstractAuditingEntity { @CreatedDate @Column ( name = "ts_created" , updatable = false ) private Instant tsCreated ; @CreatedBy @Column ( name = "id_created" ) private String idCreated ; // ... otros campos } public class MiEntidad extends AbstractAuditingEntity { // ... campos de la entidad } Cuando copiamos propiedades usando: BeanUtils . copyProperties ( entidadOrigen , entidadDestino ) ; La operación sobrescribe silenciosamente los campos de auditoría, rompiendo la funcionalidad de auditoría automática de JPA. El Impacto Esto ...