Erro inner join + group by + hibernate

6 respostas
J

oi pessoal,

eu estou fazendo uma consulta no banco (a principio era para ser simples), mas o que eu coloco em hql fica muito estranho no sql.

Quero consultar um cliente que esteja com todos os lancamentos pagos e o cliente precisa estar na condição de tomador de serviço.

Meu hql:
StringBuilder hql = new StringBuilder("select l.cliente from Lancamento l");
        hql.append(" join l.cliente c ");
        hql.append(" join c.tomador t ");
        hql.append("where t.codigo is not null "); 
        hql.append("and  (l.valorPago > '0' or l.valorPago >= L.valorDebito) ");
        hql.append("GROUP BY l.cliente");
        Query query = getEntityManager().createQuery(hql.toString());
        return query.getResultList();

a ideia do hql é trazer todos os clientes que sejam tomador e não possuem debito.

mas ele me gera um sql muito estranho e que dá erro.
select
        cliente3_.cliente_id as cliente1_15_,
        cliente3_.cliente_codigo as cliente2_15_,
        cliente3_.cliente_data_nascimento as cliente3_15_,
        cliente3_.cliente_ativo as cliente4_15_,
        cliente3_.cliente_capital_social as cliente5_15_,
        cliente3_.cliente_celular as cliente6_15_,
        cliente3_.cliente_cnh_categoria as cliente7_15_,
        cliente3_.cliente_cnh_numero as cliente8_15_,
//varios outros campos
        
    from
        cadastro.lancamento lancamento0_ 
    inner join
        cadastro.cliente cliente1_ 
            on lancamento0_.cliente_codigo=cliente1_.cliente_id 
    inner join
        cadastro.tomador tomador2_ 
            on cliente1_.cliente_id=tomador2_.cliente_id 
    inner join
        cadastro.cliente cliente3_ 
            on lancamento0_.cliente_codigo=cliente3_.cliente_id cross 
    join
        cadastro.cliente cliente4_ 
    where
        lancamento0_.cliente_codigo=cliente4_.cliente_id 
        and (
            cliente4_.cliente_id is not null
        ) 
        and (
            lancamento0_.valor_pago>'0.0' 
            or lancamento0_.valor_pago>=lancamento0_.valor_debito
        ) 
    group by
        lancamento0_.cliente_codigo

são gerados 4 inner join com a entidade cliente

E ainda da erro, porque no group by, ele chama o cliente de lancamento e no select ele busca direto de cliente.

ERRO: coluna "cliente3_.cliente_id" deve aparecer na cláusula GROUP BY ou ser utilizada em uma função de agregação

o que tem de errado no meu hql? :shock:

pq ele gera tanto join com a mesma tabela?

6 Respostas

E

Não tenho certeza, mas tente deixar dessa forma (alterado: l.cliente > c):

StringBuilder hql = new StringBuilder("select c from Lancamento l");
        hql.append(" join l.cliente c ");
        hql.append(" join c.tomador t ");
        hql.append("where t.codigo is not null "); 
        hql.append("and  (l.valorPago > '0' or l.valorPago >= L.valorDebito) ");
        hql.append("GROUP BY c");
        Query query = getEntityManager().createQuery(hql.toString());
        return query.getResultList();
J

existe diferença entre definir inner join ao invés de só join?

E

Não. Inclusive, você não precisaria fazer o inner join e ao invés, utilizar o relacionamento direto nas cláusulas (l.cliente.codigo = x).

J

deu erro do jeito que vc falou

agora é como se eu tivesse que especificar todos os atributos da entidade cliente no group by

erro:
ERROR: column "cliente1_.cliente_data_nascimento" must appear in the GROUP BY clause or be used in an aggregate function
o sql gerado
select
        cliente1_.cliente_id as cliente1_15_,
        cliente1_.cliente_data_nascimento as cliente2_15_,
        cliente1_.cliente_ativo as cliente3_15_,
        cliente1_.cliente_capital_social as cliente4_15_,
        cliente1_.cliente_celular as cliente5_15_,
        cliente1_.cliente_cnae_primario_id as cliente60_15_,
        cliente1_.cliente_cnh_categoria as cliente6_15_,
  
      
    from
        cadastro.lancamento lancamento0_ 
    inner join
        cadastro.cliente cliente1_ 
            on lancamento0_.cliente_codigo=cliente1_.cliente_id 
    inner join
        cadastro.tomador tomador2_ 
            on cliente1_.cliente_id=tomador2_.cliente_id 
    where
        (
            tomador2_.codigo is not null
        ) 
        and (
            lancamento0_.valor_pago>'0.0' 
            or lancamento0_.valor_pago>=lancamento0_.valor_debito
        ) 
    group by
        cliente1_.cliente_id
J

eu gerei o sql sem p group by e funcionou.

Só como group by que ele da problema

P

Eu não uso stringBuilder

eu crio um pacote chamado Query e cada classe dominio tem sua classe query

exemplo

package br.com.query;

public class ClienteQuery  {
	

	/***************************************************************************************************/
	/**                                                                                                                                                                        */   
	/**   QUERY'S HQL 		     														                     */
	/**																					     */
	/***************************************************************************************************/
	
	
	public static String buscarTodosOrdenado =   " Select c From Cliente c  OrderBy c.cnpj                          		" ;

     
}

ai na classe vc chama esta query

Query query = entityManager.createQuery(ClienteQuery.buscarTodosOrdenado )
         query.getExecuteQueryList();;
Criado 22 de fevereiro de 2013
Ultima resposta 22 de fev. de 2013
Respostas 6
Participantes 3