Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
1
respuesta

[Duda] Esta función debería de lanzar un error?

Tengo una duda sobre el siguiente código, en el curso se no dice que el código tiene un problema en la clapsula WHERE ya que falta una condicion para evitar el "WHERE AND", pero también deberia de fallar por que el String es imutable?

public List<Cliente> buscarClientes(String nombre, LocalDate fechaNacimiento) {
    String jpql = "SELECT c FROM Cliente c WHERE ";
    if (nombre != null && !nombre.trim().isEmpty()) {
        jpql += "AND c.nombre = :nombre ";
    }
    if (fechaNacimiento != null) {
        jpql += " AND c.fechaNacimiento = :fechaNacimiento ";
    }
    TypedQuery<Cliente> query = em.createQuery(jpql, Cliente.class);
    if (nombre != null && !nombre.trim().isEmpty()) {
        query.setParameter("nombre", nombre);
    }
    if (fechaNacimiento != null) {
        query.setParameter("fechaNacimiento", fechaNacimiento);
    }
    return query.getResultList();
}
1 respuesta
solución!

Hola Estudiante,

Si, esto significa que si tanto el parámetro "nombre" como el parámetro "fechaNacimiento" son nulos, la consulta generada tendrá un "AND" adicional al principio.

Entonces se lanzará una excepción, independientemente de los parámetros ingresados. Esto se debe a que la consulta generada tendrá un error de sintaxis debido al "WHERE AND" adicional si ambos parámetros son nulos.

También puedes modificar el código para agregar una condición adicional en la cláusula WHERE para evitar el "WHERE AND". Por ejemplo:

public List<Cliente> buscarClientes(String nombre, LocalDate fechaNacimiento) {
    String jpql = "SELECT c FROM Cliente c WHERE 1=1"; // Agregar una condición siempre verdadera al principio
    if (nombre != null && !nombre.trim().isEmpty()) {
        jpql += " AND c.nombre = :nombre ";
    }
    if (fechaNacimiento != null) {
        jpql += " AND c.fechaNacimiento = :fechaNacimiento ";
    }
    TypedQuery<Cliente> query = em.createQuery(jpql, Cliente.class);
    if (nombre != null && !nombre.trim().isEmpty()) {
        query.setParameter("nombre", nombre);
    }
    if (fechaNacimiento != null) {
        query.setParameter("fechaNacimiento", fechaNacimiento);
    }
    return query.getResultList();
}

Con esta modificación, la consulta generada será válida incluso si ambos parámetros son nulos.

Sobre la inmutabilidad de las cadenas, tienes razón en mencionar este aspecto. En Java, las cadenas son inmutables, lo que significa que una vez que se crea una cadena, no se puede cambiar. Sin embargo, en tu código, estás utilizando la concatenación de cadenas para construir la consulta JPQL. Cada vez que realizas una concatenación, se crea una nueva cadena, lo cual puede ser ineficiente en términos de rendimiento.

Considera el uso de StringBuilder para mejorar el rendimiento, ya que StringBuilder permite construir cadenas mutables de manera eficiente.

Espero haber resuelto tu duda. Mucho éxito en todo lo que te propongas y si tienes alguna duda aquí estaremos para apoyarte.

¡Vamos juntos!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios