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)
6
respuestas

[Duda] Usando MySQL para el proyecto me arroja error. (Tengo el mismo código)

PedidoDao

    public List<Object[]> relatorioDeVentas(){
        String jpql = "SELECT producto.nombre, " 
                + "SUM(item.cantidad), " 
                + "MAX(pedido.fecha) " 
                + "FROM Pedido pedido "
                + "JOIN pedido.items item " 
                + "JOIN item.producto producto " 
                + "GROUP BY producto.nombre "
                + "ORDER BY item.cantidad DESC";        
        return em.createQuery(jpql,Object[].class).getResultList();
    }

RegistroDePedido

        List<Object[]> relatorio = pedidoDao.relatorioDeVentas();

        for(Object[] obj:relatorio) {
            System.out.println(obj[0]);
            System.out.println(obj[1]);
            System.out.println(obj[2]);
        }

Pero me arroja los siguientes errores:

abr 18, 2023 7:35:48 A.�M. org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1055, SQLState: 42000
abr 18, 2023 7:35:48 A.�M. org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'tienda.items1_.cantidad' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1626)
    at org.hibernate.query.Query.getResultList(Query.java:165)
    at com.latam.alura.tienda.dao.PedidoDao.relatorioDeVentas(PedidoDao.java:50)
    at com.latam.alura.tienda.prueba.RegistroDePedido.main(RegistroDePedido.java:48)
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:37)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:67)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:2322)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2075)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2037)
    at org.hibernate.loader.Loader.doQuery(Loader.java:956)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:357)
    at org.hibernate.loader.Loader.doList(Loader.java:2868)
    at org.hibernate.loader.Loader.doList(Loader.java:2850)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2682)
    at org.hibernate.loader.Loader.list(Loader.java:2677)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:540)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:400)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:219)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1459)
    at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1649)
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1617)
    ... 3 more
Caused by: java.sql.SQLSyntaxErrorException: Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'tienda.items1_.cantidad' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:972)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57)
    ... 18 more

No logro encontrar la solución. Espero puedan apoyarme. Saludos

6 respuestas
solución!

me daba un error similar pero yo crei que porque tengo mas de un registro en mi tabla pedidos e items_pedido; yo modifique el codigo asi:

    public List<Object[]> relatorioDeVentas(){
        String jpql = "SELECT producto.nombre, " 
                + "SUM(item.cantidad), " 
                + "MAX(pedido.fecha) " 
                + "FROM Pedido pedido "
                + "JOIN pedido.items item " 
                + "JOIN item.producto producto " 
                + "GROUP BY producto.nombre "
                + "ORDER BY SUM(item.cantidad) DESC";  // LINEA MODIFICADA          
        return em.createQuery(jpql,Object[].class).getResultList();
    }

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad Segun chatGPT esta es la causa.

Mauricio, te agradezco mucho tu respuesta. Me ayudó a aclarar y resolver la duda. Ya funciona mi código. Mil gracias

Me alegro Claudio, una consulta trabajando con MySql no has tenido que modificar ninguna query JPQL que se muestra en los videos ? quedo atento gracias.

Hola, me ha funcionado unicamente actualizando las rutas. En lugar de las rutas determinadas de H2 Database como lo mencionan en el curso por las de MySQL. Pero el proceso completo de las querys me ha funcionado sin problema.

Yo tenia el mismo error, pero la solucion fue agregar todas las consultas que se estan requiriendo en la clausula SELECT, en la clausula GROUP BY. Quedaria asi:

"SELECT producto.nombre, " 
                +"SUM(item.cantidad), "
                +"MAX(pedido.fecha) "
                +"FROM Pedido pedido "
                +"JOIN pedido.items item "
                +"JOIN item.producto producto "
                +"GROUP BY producto.nombre, item.cantidad "
                +"ORDER BY item.cantidad DESC, producto.nombre DESC";

En la clausula GROUP BY solo estaba agregada la consulta del nombre de los productos, faltaba agregar la consulta de item.cantidad que esta dentro de la funcion de agregacion SUM().