3
respostas

Aula 04. NHibernate.Exceptions.GenericADOException: 'could not execute query - "column \"categoria1_.id\" must appear in the GROUP BY clause or be used in an aggregate function"

Boa tarde, traquilo? Alguem pode ajudar?

Esta dando o seguinte erro: NHibernate.Exceptions.GenericADOException: 'could not execute query

[ select produto0.CategoriaID as col_0_0, count(produto0.Id) as col_1_0, categoria1.Id as Id1_1, categoria1.Nome as Nome2_1 from Produto produto0 inner join Categoria categoria1 on produto0.CategoriaID=categoria1.Id group by produto0_.CategoriaID ]

[SQL: select produto0.CategoriaID as col_0_0, count(produto0.Id) as col_1_0, categoria1.Id as Id1_1, categoria1.Nome as Nome2_1 from Produto produto0 inner join Categoria categoria1 on produto0.CategoriaID=categoria1.Id group by produto0_.CategoriaID]'

"column \"categoria1_.id\" must appear in the GROUP BY clause or be used in an aggregate function"

class Program
    {
        static void Main(string[] args)
        {
            ISession session = NHibernateHelper.AbreSession();
           string hql = "select p.Categoria as Categoria, count(p) as NumeroDeProdutos " +
             "from Produto p group by p.Categoria";
            IQuery q = session.CreateQuery(hql);
            q.SetResultTransformer(Transformers.AliasToBean<ProdutosPorCategoria>());
            IList<ProdutosPorCategoria> relatorio = q.List<ProdutosPorCategoria>();

            foreach (ProdutosPorCategoria resultado in relatorio)
            {
                Console.WriteLine(resultado.Categoria.Nome + " " + resultado.NumeroDeProdutos);
            }

            session.Close();
            Console.Read();
        }
    }

public class ProdutosPorCategoria
    {
        public Categoria Categoria { get; set; }

        public long NumeroDeProdutos { get; set; }
    }

public class Categoria
    {
        public virtual int Id { get; set; }
        public virtual string Nome { get; set; }
        public virtual IList<Produto> Produtos { get; set; }
    }

public class Produto
    {
        public virtual int Id { get; set; }
        public virtual string Nome { get; set; }
        public virtual double Preco { get; set; }
        public virtual Categoria Categoria { get; set; }
    }
3 respostas

Já tentou isso?

"SELECT p.Categoria as Categoria, COUNT(*) as NumeroDeProdutos " + "FROM Produto p GROUP BY (p.Categoria.id)";

Boa noite Mauricio, tranquilo?

Obrigado pelo retorno, mas não deu certo.

Obs. Estou usando o postgresql.

Olá,

Vejo que o tópico foi criado há mais de três meses mas, no que for de ajuda pra quem consultar no futuro:

Usando o SQL Server 2012, só consegui realizar o agrupamento de maneira correta com o seguinte código:

        ISession session = NHibernateHelper.AbreSession();
            string hql = "select p.Categoria.Nome, count(p) from Produto p group by p.Categoria.Nome";
            IQuery query = session.CreateQuery(hql);

            IList<Object[]> resultados = query.List<Object[]>();

            IList<ProdutosPorCategoria> relatorio = new List<ProdutosPorCategoria>();
            ProdutosPorCategoria p = new ProdutosPorCategoria();

            foreach (Object[] resultado in resultados)
            {
                p.NomeCategoria = (string)resultado[0];
                p.NumeroDePedidos = (long)resultado[1];

                relatorio.Add(p);
            }