[HIBERNATE] problema utilizando Restrictions.isNull() para atributos mapeados

6 respostas
bonfarj

No meu mapeamento, uma SolicitacaoCotacao possui uma Cotacao, um relacionamento one-to-one. Estou tendo problemas para realizar uma query com criteria, vejam:

List<Criterion> criterios = new ArrayList<Criterion>();

criterios.add(Restrictions.isNull("cotacao"));

Quando adiciono esse Criterion na em uma Criteria de SolicitacaoCotacao eu espero que ele retorne todas as instâncias de SolicitacaoCotacao que não possuem uma Cotacao, ou seja, que o atributo cotacao seja null. Porém ele não retorna nenhuma instância. Vejam o SQL gerado:

Hibernate: 
    /* criteria query */ select
        this_.id as id76_1_,
        this_.qtde as qtde76_1_,
        this_.referenciaCliente as referenc3_76_1_,
        this_.localEntrega as localEnt4_76_1_,
        this_.solicitante as solicita5_76_1_,
        this_.dataAbertura as dataAber6_76_1_,
        this_.dataVencimento as dataVenc7_76_1_,
        this_.idProduto as idProduto76_1_,
        this_.idCliente as idCliente76_1_,
        cotacao1_.id as id21_0_,
        cotacao1_.nome as nome21_0_,
        cotacao1_.preco as preco21_0_,
        cotacao1_.condicaoPagamento as condicao4_21_0_,
        cotacao1_.prazoEntrega as prazoEnt5_21_0_,
        cotacao1_.classificacaoFiscal as classifi6_21_0_,
        cotacao1_.ipi as ipi21_0_,
        cotacao1_.icms as icms21_0_,
        cotacao1_.iss as iss21_0_,
        cotacao1_.data as data21_0_,
        cotacao1_.validadeProposta as validad11_21_0_,
        cotacao1_.idSolicitacaoCotacao as idSolic12_21_0_ 
    from
        solicitacaocotacao this_ 
    inner join
        cotacao cotacao1_ 
            on this_.id=cotacao1_.idSolicitacaoCotacao 
    where
        this_.id is null 
    order by
        this_.id desc limit ?

Destacando o que realmente interessa:

from
        solicitacaocotacao this_ 
    inner join
        cotacao cotacao1_ 
            on this_.id=cotacao1_.idSolicitacaoCotacao 
    where
        this_.id is null 
    order by
        this_.id desc limit ?

O que estou fazendo errado? No fórum do Hibernate tem um cara que postou exatamente o mesmo problema que o meu, mas ele não teve resposta, vejam aqui

abraços!

6 Respostas

bonfarj

Ninguém sabe de nada relacionado a isso não? Qualquer coisa não deixem de postar, estou ficando doido com isso, não sei se estou fazendo algo errado (mais provável) ou se é um problema do Hibernate. A princípio, tudo que pode ser feito com HQL pode ser feito com o Criteria, não?

abraços a todos!

bonfarj

Alguém se arrisca? :stuck_out_tongue:
É algo aparentemente simples que eu não consigo fazer utilizando a Criteria API.

abraços!

plentz

Se você reparar a query gerada é facil identificar o problema.

from solicitacaocotacao this_ inner join cotacao cotacao1_ on this_.id=cotacao1_.idSolicitacaoCotacao where this_.id is null order by this_.id desc limit ?

Ele está fazendo um inner join entre solicitacaoCotacao e cotacao, e ele está colocando como restrição o id de solicitacaoCotacao ser null, fazendo que nunca retorne nada.

bonfarj

Oi, plentz!

Isso eu percebi, mas como fazer para o Hibernate retornar o código certo? Eu consigo fazer isso com HQL, com Criteria não.

abraços!

plentz

Coloque o seu código da criteria completo.

bonfarj

Não estou com o código original agora, faz parte de um conjunto de métodos para busca por protótipo com filtros que criei. Vou dar um exemplo simples:

Criteria criteria = session.createCriteria(SolicitacaoCotacao.class);

criteria.add(Restrictions.isNull("cotacao"));

List solicitacoesCotacao = criteria.list();
Na segunda eu posso adicionar o mapeamento ou alguma outra informação.

abraços e valeu pela ajuda!

Criado 7 de março de 2007
Ultima resposta 14 de abr. de 2007
Respostas 6
Participantes 2