Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Problema no exercício do capitulo 4 , número de produtos por categoria

solução

Oi Rubens

O problema é que quando fazemos um group by na sql tradicional, só podemos selecionar o campos que foram colocados no group by ou funções agregadas (sum, count, avg, ...)

Mas quando fazemos o group by por id, existe uma extensão da SQL que nos permite fazer a seleção de outros campos, essa extensão é suportada no MySQL (o banco utilizado nos vídeos) e não no SQL Server.

Para uma possível solução para esse problema, você pode olhar a discussão: http://www.alura.com.br/course/FN-24/discussions/229567

Caso você tenha alguma dificuldade para implementar a solução, poste novamente nessa mesma thread.

2 respostas

Obrigado Victor!

Oi pessoal, estou com esse problema, podem me ajudar? O problema a princípio e da query gerada não ter agrupamento dos campos de Id e Nome da categoria.

Column 'Categoria.Id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Data.SqlClient.SqlException: Column 'Categoria.Id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Source Error: 


Line 55:             IQuery query = session.CreateQuery(hql);
Line 56:             query.SetResultTransformer(Transformers.AliasToBean<ProdutosPorCategoria>());
Line 57:             return query.List<ProdutosPorCategoria>();
Line 58:         }
Line 59:     }
using LojaWeb.Entidades;
using LojaWeb.Models;
using NHibernate;
using NHibernate.Transform;
using System;
using System.Collections.Generic;

namespace LojaWeb.DAO
{
    public class CategoriasDAO
    {
        private ISession session;

        public CategoriasDAO(ISession session)
        {
            this.session = session;
        }

        public void Adiciona(Categoria categoria)
        {
            this.session.Save(categoria);
        }

        public void Remove(Categoria categoria)
        {

        }

        public void Atualiza(Categoria categoria)
        {
            this.session.Merge(categoria);
        }

        public Categoria BuscaPorId(int id)
        {
            return session.Get<Categoria>(id);
        }

        public IList<Categoria> Lista()
        {
            return new List<Categoria>();
        }

        public IList<Categoria> BuscaPorNome(string nome)
        {
            string hql = "from Categoria c where c.Nome = :nome";
            IQuery query = session.CreateQuery(hql);
            query.SetParameter("nome", nome);
            return query.List<Categoria>();
        }

        public IList<ProdutosPorCategoria> ListaNumeroDeProdutosPorCategoria()
        {
            string hql = "select p.Categoria as Categoria, count(p) as NumeroDeProdutos from Produto p group by p.Categoria";
            IQuery query = session.CreateQuery(hql);
            query.SetResultTransformer(Transformers.AliasToBean<ProdutosPorCategoria>());
            return query.List<ProdutosPorCategoria>();
        }
    }
}
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="LojaWeb" namespace="LojaWeb.Entidades">
    <class name="Categoria">
        <id name="Id">
            <generator class="identity"/>
        </id>
        <property name="Nome"/>

        <bag name="Produtos" inverse="true">
            <key column="CategoriaId" />
            <one-to-many class="Produto" />
        </bag>
    </class>
</hibernate-mapping>
using System.Collections.Generic;

namespace LojaWeb.Entidades
{
    public class Categoria
    {
        public virtual int Id { get; set; }

        public virtual string Nome { get; set; }

        public virtual IList<Produto> Produtos { get; set; }
    }
}