4
respuestas

[Problema] aplicacion no muestra resulSet por consola

Hola! estoy teniendo un problema al mostrar el resultado por consola, dejo mi codigo de productoDAO y de mi main:

Main

public static void main(String[] args) {

    Categoria celulares = new Categoria("celulares");

    registrarProducto();

    EntityManager entityManager = JPAUtils.getEntityManager();
    ProductoDAO productoDAO = new ProductoDAO(entityManager);

    Producto motorola2 = new Producto("Moto one zoom",
                                      "Usado, en perfecto estado",
                                      new BigDecimal("500"),
                                      celulares);

    Producto motorola3 = new Producto("Moto one hyper",
                                      "Usado, en perfecto estado",
                                      new BigDecimal("570"),
                                      celulares);

    CategoriaDAO categoriaDAO = new CategoriaDAO(entityManager);
    entityManager.getTransaction().begin();

    categoriaDAO.devolverEstadoMerge(celulares); //esto es el metodo merge()
    categoriaDAO.guardar(celulares); //esto es el metodo persist()

    productoDAO.guardar(motorola2);
    productoDAO.guardar(motorola3);

    List<Producto> productoList = productoDAO.findByName("Moto");
    productoList.forEach(prod -> System.out.println(prod.getDescripcion()));

    entityManager.getTransaction().commit();
    entityManager.close();
    }

    private static void registrarProducto() {
        Categoria celulares = new Categoria("celulares");
        Producto motorola = new Producto("Moto one vision",
                                         "Usado, en perfecto estado",
                                         new BigDecimal("449"),
                                         celulares);

        EntityManager entityManager = JPAUtils.getEntityManager();

        ProductoDAO productoDAO = new ProductoDAO(entityManager);
        CategoriaDAO categoriaDAO = new CategoriaDAO(entityManager);

        entityManager.getTransaction().begin();

        productoDAO.guardar(motorola);
        categoriaDAO.guardar(celulares);

        entityManager.getTransaction().commit();
        entityManager.close();
    }

ProductoDAO

public class ProductoDAO {
    public List<Producto> findByName(String nombre){
         String jpql = "SELECT P 
                        FROM Producto AS P 
                        WHERE P.nombre LIKE :nombre";

        return entityManager
                .createQuery(jpql)
                .setParameter("nombre", nombre)
                .getResultList();
    }
}

Log de consola

Hibernate: 
    create table categorias (
       id bigint generated by default as identity,
        nombre varchar(255),
        primary key (id)
    )
Hibernate: 
    create table productos (
       id bigint generated by default as identity,
        descripcion varchar(255),
        fechaRegistro date,
        nombre varchar(255),
        precio numeric(19,2),
        categoria_id bigint,
        primary key (id)
    )
Hibernate: 
    alter table productos 
       add constraint FK2fwq10nwymfv7fumctxt9vpgb 
       foreign key (categoria_id) 
       references categorias
Hibernate: 
    insert 
    into
        productos
        (id, categoria_id, descripcion, fechaRegistro, nombre, precio) 
    values
        (default, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        categorias
        (id, nombre) 
    values
        (default, ?)
Hibernate: 
    update
        productos 
    set
        categoria_id=?,
        descripcion=?,
        fechaRegistro=?,
        nombre=?,
        precio=? 
    where
        id=?
Hibernate: 
    insert 
    into
        categorias
        (id, nombre) 
    values
        (default, ?)
Hibernate: 
    insert 
    into
        categorias
        (id, nombre) 
    values
        (default, ?)
Hibernate: 
    insert 
    into
        productos
        (id, categoria_id, descripcion, fechaRegistro, nombre, precio) 
    values
        (default, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        productos
        (id, categoria_id, descripcion, fechaRegistro, nombre, precio) 
    values
        (default, ?, ?, ?, ?, ?)
Hibernate: 
    select
        producto0_.id as id1_1_,
        producto0_.categoria_id as categori6_1_,
        producto0_.descripcion as descripc2_1_,
        producto0_.fechaRegistro as fechareg3_1_,
        producto0_.nombre as nombre4_1_,
        producto0_.precio as precio5_1_ 
    from
        productos producto0_ 
    where
        producto0_.nombre like ?

Tambien me pasa lo mismo si cambio lo siguiente en la funcion findByName()

    String jpql = "SELECT P 
                   FROM Producto AS P 
                   WHERE P.nombre=:nombre";

MI duda es: porque NO me esta dando la resultList en mi Main para poder loguearlo por consola?

PD: seria genial que aumenten la cantidad de palabras por hilo, con 5000 me quede corto, tuve que sacar codigo interesante para la consulta

PD2: con el metodo "consultarPorNombreDeCategoria()" uso LIKE y anda bien, me devuele una resultList que se imprime en consola, no asi con el metodo findByName()

Desde ya muchas gracias

4 respuestas

Hola Alexis, espero que estés bien!

Creo que el error se queda en como estás usando la String, porque con el comando LIKE tenemos que usar una formatación junto con la String, yo voy mostrar tres ejemplos con la String "Moto":

  1. Caso deseas una consulta con un producto que tenga 'Moto' en el nombre (si 'Moto' está al principio, al medio o al final del nombre):
    "SELECT P FROM Producto AS P WHERE P.nombre LIKE '%' + :nombre + '%' ";
  2. Caso deseas una consulta que tenga 'Moto' al principio al nombre del producto:
    "SELECT P FROM Producto AS P WHERE P.nombre LIKE :nombre + '%' ";
  3. Caso deseas una consulta que tenga 'Moto' al final al nombre del producto:
    "SELECT P FROM Producto AS P WHERE P.nombre LIKE '%' + :nombre ";

Dos sugerencias de lectura: Microsoft (en espanol): https://learn.microsoft.com/es-es/sql/t-sql/language-elements/like-transact-sql?view=sql-server-ver16#pattern w3schools (en inglés): https://www.w3schools.com/sql/sql_like.asp

Saludos y buenos estudios!

hola Brenda! gracias por responder! como dije en el PD2, usando LIKE en la consulta JPQL de mi siguiente metodo, no tengo problemas, dejo mi metodo

public List<Producto> findByCategoria(String categoria){
        String jpql = "SELECT P 
                        FROM Producto P 
                        WHERE P.categoria.nombre LIKE :categoria";
        return entityManager
                .createQuery(jpql, Producto.class)
                .setParameter("categoria", categoria)
                .getResultList();
    }

en ese metodo funciona bien, me devuelve lo que pretendo o busco sin necesidad de usar los modificadores %

A demas de que el metodo tampoco funciona usando la misma forma que el profesor propone

public class ProductoDAO {
    public List<Producto> findByName(String nombre){
         String jpql = "SELECT P 
                        FROM Producto AS P 
                        WHERE P.nombre=:nombre";

        return entityManager
                .createQuery(jpql)
                .setParameter("nombre", nombre)
                .getResultList();
    }
}

de esa forma tampoco me esta devolviendo nada, no recuerdo si aparece como null o directamente no imprime, lo veo a la brevedad y comento a penas recuerde.

¡Hola Alexis!

En tu código, veo que estás usando el método findByName() de la clase ProductoDAO para buscar productos por su nombre. El método parece estar bien escrito y debería devolver una lista de productos que coincidan con el nombre proporcionado.

Puede haber varias razones por las que no estás obteniendo resultados en la consola. Una posible razón es que no haya productos en la base de datos que coincidan con el nombre proporcionado. También puede ser que haya algún error en tu código que esté impidiendo que se muestren los resultados.

Te sugiero que agregues algunos mensajes de registro en tu código para verificar si el método findByName() se está ejecutando correctamente y si está devolviendo algún resultado. Por ejemplo, puedes agregar un mensaje de registro justo antes de la línea productoList.forEach(prod -> System.out.println(prod.getDescripcion())) para verificar si la lista de productos está vacía o no.

Espero que esto te ayude a solucionar el problema. ¡Buena suerte y sigue adelante!

Ups mensaje enganada