[Resolvido] Hibernate - "not in", como fazer de maneira simples?

3 respostas
marcelo.bellissimo

Pessoal, seguinte

Tenho 3 tabelas/objetos… Operacao, ControleOperacao, e SubOperacao

Como deve ser bem óbvio, ControleOperacao e SubOperacao possuem objetos Operacao (da tabela Operacao) dentro delas…

O que eu gostaria de fazer é: selecionar todos os objetos Operacao, que NÃO estão nas duas tabelas ControleOperacao e SubOperacao… se fosse ao contrário até que seria fácil, mas para esse caminho inverso, não consegui chegar em nenhuma conclusão “limpa”… o que fiz foi:

  • Selecionar todos da tabela Operacao em uma lista
  • Selecionar todos (não repetidos) da tabela ControleOperacao e subtrair da lista de Operacao
  • Selecionar todos (não repetidos) da tabela SubOperacao e subtrair da lista de Operacao
    Desse jeito, tenho apenas os objetos Operacao que não estão nas duas tabelas mencionadas… mas achei esse método meio porco e um tanto custoso, pois faz um full select das tabelas, isso vai causar problemas quando a demanda for grande e a tabela estiver muito grande…

Alguma maneira fácil de resolver isso?

Obrigado!

3 Respostas

S

Amigo tenta dessa forma !!!

from Operacao op where op.id not in (select co.op.id from ControleOperacao co)
and op.id not in(select sub.op.id from SubOperacao sub);

espero ter ajudado !!!

marcelo.bellissimo

Cara, muito bom… não cheguei a pensar em usar HQL, não estou acostumado, mas funcionou direitinho, apenas alguns ajustes nos nomes dos atributos…

Muito obrigado… agora vou até começar a estudar mais sobre HQL, ele quebra um galho imenso…

marcelo.bellissimo

Apenas para referência, se alguem quiser saber como foi feito, aqui o código HQL:

//Operacao que não está nem na CotnroleOperacao, nem na SubOperacao: Query query = session.createQuery( "from Operacao op " + "where op.id not in (select co.operacao.id from ControleOperacao co where co.operacao.id != null) " + "and op.id not in(select co.operacaoPai.id from ControleOperacao co where co.operacaoPai.id != null)" + "and op.id not in(select sub.pk.operacao.id from SubOperacao sub where sub.pk.operacao.id != null)" + "and op.id not in(select sub.pk.operacaoPai.id from SubOperacao sub where sub.pk.operacaoPai.id != null)" ); return query.list();

//Operacao que está na CotnroleOperacao, ou na SubOperacao: Query query = session.createQuery( "from Operacao op " + "where op.id in (select co.operacao.id from ControleOperacao co where co.operacao.id != null) " + "or op.id in(select co.operacaoPai.id from ControleOperacao co where co.operacaoPai.id != null)" + "or op.id in(select sub.pk.operacao.id from SubOperacao sub where sub.pk.operacao.id != null)" + "or op.id in(select sub.pk.operacaoPai.id from SubOperacao sub where sub.pk.operacaoPai.id != null)" ); return query.list();
:thumbup:

Criado 5 de março de 2009
Ultima resposta 6 de mar. de 2009
Respostas 3
Participantes 2