Query is not null ou is null - resolvido

SELECT p FROM Processo p WHERE (:statusDefAutomatico is null OR p.statusDefAutomatico = :statusDefAutomatico)
Page<Processo> listarProcessos(@Param("statusDefAutomatico") Boolean statusDefAutomatico, Pageable pageable);

No caso a variavel statusDefAutomatico pode vir:

  1. null - está funcionando
  2. true - a consulta deve ser p.statusDefAutomatico is not null
  3. false - a consulta deve ser p.statusDefAutomatico is null

os itens 2 e 3 não estão funcionando, porque a query tem que ser igual. Como desenvolver esta query ?

Estranho, pelo código, parece que está certo. Coloca para imprimir a consulta no console junto com os parâmetros e veja como a JPA está montando a query.

1 curtida

Se a variavel statusDefAutomatico vier com valor true, vai retornar todos os resultados com p.statusDefAutomatico = true e não todos os resultados com p.statusDefAutomatico is not null

Se a variavel statusDefAutomatico vier com valor false, vai retornar os resultados com p.statusDefAutomatico = false e não os resultados com p.statusDefAutomatico is null

1 curtida

Desculpe, este campo no banco de dados e na classe não é boolean. É um enum

@Enumerated(EnumType.STRING)
@Column(name = "STATUS_DEF_AUTOMATICO")
private DomStatusDeferimentoAutomatico statusDefAutomatico;

Então porque estás a comparar o valor da variavel Boolean statusDefAutomatico com o da coluna String statusDefAutomatico?

O que queres deve ser algo assim

SELECT p 
  FROM Processo p
 WHERE (((:statusDefAutomatico is null or :statusDefAutomatico = false) AND p.statusDefAutomatico is null) or (:statusDefAutomatico = true AND p.statusDefAutomatico is not null))
1 curtida
select * 
from (
  select distinct 
    processo0_.id_processo as id_processo1_111_, 
    processo0_.criado_por as criado_por2_111_, 
    processo0_.data_criacao as data_criacao3_111_, 
    processo0_.data_ultima_modificacao as data_ultima_modifi4_111_, 
    processo0_.modificado_por as modificado_por5_111_, 
    processo0_.id_usuario_responsavel_gravacao as id_usuario_respon14_111_, 
    processo0_.id_usuario_responsavel_ultima_alteracao as id_usuario_respon15_111_, 
    processo0_.data_alteracao_status as data_alteracao_sta6_111_, 
    processo0_.data_inativacao as data_inativacao7_111_, 
    processo0_.numero_processo as numero_processo8_111_, 
    processo0_.id_processo_pai as id_processo_pai16_111_, 
    processo0_.permite_recepcao_doc_digital as permite_recepcao_d9_111_, 
    processo0_.protocolo_legado_sanacao as protocolo_legado_10_111_, 
    processo0_.regional as regional11_111_, 
    processo0_.id_solicitacao_principal as id_solicitacao_pr17_111_, 
    processo0_.status_def_automatico as status_def_automa12_111_, 
    processo0_.id_status_processo as id_status_process18_111_, 
    processo0_.tipo_entrega as tipo_entrega13_111_ 
  from 
    registro_jucesp.processo processo0_ 
  where (? is null or processo0_.status_def_automatico=?)
)
where rownum <= ?

Se vc pega essa consulta gerada, substitui as interrogações com as variações do parâmetro (passando null e preenchido), ela retorna corretamente?

1 curtida

Porque o que vem do front é

null
true
false

Porque se for false, a consulta deve buscar todas as informações que este campo seja null

Porque se for true, a consulta deve buscar todas as informações que este campo seja not null

não consegui fazer chegar isso jpa

Não @Lucas_Camara

acho que estou fazendo errado

Viste o que pus acima?

1 curtida