Consulta jpql com filtro em duas tabelas relacionadas

6 respostas
programaçãojava
A

Bom dia.

Estou tendo problemas ao realizar consulta com filtros usando jpql. Tenho a tabela Pessoa com um relacionamento @OneToMany com InfoCriminal, estou fazendo a consulta da seguinte forma, quando deixo os campos em branco de ambas as tabelas penso que seria para retornar todos os registros da tabela Pessoa mas isso não ocorre, pois se houver algum registro “null” da tabela filha InfoCriminal o registro de Pessoa não retorna.

Alguém tem alguma dica para resolver isso?

public List<Pessoa> filtroCompleta(Pessoa pessoa, InfoCriminal infoCriminal) {
	
	String jpql ="SELECT DISTINCT p FROM Pessoa p LEFT JOIN p.infoCriminal ic WHERE (p.nome like :nome and ic.artigo like :artigo) ";
	TypedQuery<Pessoa> query = manager.createQuery(jpql, Pessoa.class);

	if (pessoa.getInfoCriminal()==null) {
		
	}
	query.setParameter("nome", "%" + pessoa.getNome() + "%");
	query.setParameter("artigo", "%" + infoCriminal.getArtigo() + "%");

	return query.getResultList();
}

6 Respostas

R

Mas vc fez sua condição por “contenha qualquer coisa”, porém NULL é outra história, não é uma String vazia. Pra isso então adiciona um (p.nome like :nome OR p.nome IS NULL) AND …

A

Obrigado @Rodrigo_Void por responder.

Seguindo sua dica fiz assim:

WHERE (p.nome like :nome or p.nome IS NULL) and (ic.artigo like :artigo or ic is NULL)

Mas quando faço uma consulta preenchendo os campos de Pessoa e InfoCriminal como filtro eu espero que retorne registros em que esses dois dados existam porém a consulta retorna também os registros em que InfoCriminal está null, e preciso corrigir isso. Sei que se eu remover o or ic is NULL corrigiria isso mas ai não são retornados os registros de Pessoa que contenham registros InfoCriminal NULL quando deixo o respectivo campo do filtro em branco. Sabe me dizer o que eu ainda estou fazendo de errado?

R

Primeiramente vc se queixou que os registros NULL não estavam vindo, lhe passei o código, agora que estão vindo vc não quer??? WTF?

Tbm revisa essa condição abaixo, pois n é assim.

A

Cara na boa, obrigado pela ajuda.

Deixa eu tentar esclarecer o que preciso. Preciso que os dados retornem na consulta mas não de qualquer jeito, o que estou dizendo é que ao realizar uma consulta na qual se preenche as informações no filtro o usuário não vai esperar que uma vez um campo preenchido na consulta, esta retorne registros nos quais os campos estão nulos.

R

Arrumou esta condição?

A

Sim, ficou assim quando postei o código aqui no fórum, devo ter apagado sem querer quando estava formatando. Mas o comportamento do código CERTO é o que expliquei.

Criado 29 de janeiro de 2019
Ultima resposta 29 de jan. de 2019
Respostas 6
Participantes 2