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

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!

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 !!!

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…

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: