Erro inner join + group by + hibernate

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.

[code]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[/code]

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?

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();

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

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).

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

[code]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[/code]

eu gerei o sql sem p group by e funcionou.

Só como group by que ele da problema

Eu não uso stringBuilder

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

exemplo

package br.com.query;

[code]public class ClienteQuery {

/***************************************************************************************************/
/**                                                                                                                                                                        */   
/**   QUERY'S HQL 		     														                     */
/**																					     */
/***************************************************************************************************/


public static String buscarTodosOrdenado =   " Select c From Cliente c  OrderBy c.cnpj                          		" ;

}

[/code]

ai na classe vc chama esta query

Query query = entityManager.createQuery(ClienteQuery.buscarTodosOrdenado ) query.getExecuteQueryList();;