Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida sobre como a String pode ser concatenada e não substituída e fazer lógica booleana e sobre a formação da query com ANDo da Query?

Boa noite, Rodrigo!

Na aula sobre busca no banco de dados, por meio da passagem de vários parâmetros para o método, não entendo como o atributo "String jpql =" é concatenado a medida que recebe novos valores. Sempre pensei que quando eu passo um novo valor para o atributo, ele passa a ter somente este novo valor, e não concatena novos valores ao valor anterior. Não bastasse isso, o atributo do tipo String está fazendo uma lógica booleana com "WHERE 1=1". Isso não faz sentido para mim. Como uma String pode concatenar valores e não substituí-los e ainda fazer uma lógica booleana?

Também não entendi porque dessa lógica na String, por que não basta colocar apenas WHERE?

Outro ponto, a primeira concatenação ao atributo jpql começa com " AND p.nome = :nome ". Caso o atributo nome fosse passado, isso resultaria na seguinte query: "SELECT p FROM Produto p WHERE AND p.nome = nome". Veja que este AND não deveria estar ali. É dessa forma que a query será escrita?

O código completo a que estou me referindo está abaixo:

public List<Produto> buscarPorParametros(String nome, BigDecimal preco, LocalData dataCadastro) {
String jpql = "SELECT p FROM Produto p WHERE 1=1 ";

if(nome != null && !nome.trim().isEmpty()) {
jpql = " AND p.nome = :nome ";
}
if(preco != null) {
jpql = " AND p.preco = :preco ";
}
if (dataCadastro != null) {
jpql = " AND p.dataCadastro = :dataCadastro ";
}
TypedQuery<Produto> query = em.createQuery(jpql, Produto.class);
    if(nome != null && !nome.trim().isEmpty()) {
    query.setParameter("nome", nome);
    }
    if(preco !=null) {
    query.setParameter("preco", preco);
    }
    if(dataCadastro !=null) {
    query.setParameter("dataCadastro", dataCadastro);
    }
    return query.getResultList();
    }
}
4 respostas

Oi Thiago,

Foi falha minha durante a gravação do vídeo mesmo. Os códigos dentros dos ifs deveriam estar concatenando com +=.

Bons estudos!

Certo, Rodrigo,

Eu não entendi a razão da expressão WHERE 1=1. Seria para o caso dos três parâmetros serem passados null? Nesse caso, a Jpa buscaria a entidade inteira? Seria Isso?

Outro ponto, caso o único parâmetro passado fosse o nome, a query seria montada da seguinte maneira? "SELECT p FROM Produto p WHERE AND p.nome = nome"

Vejo o AND não deveria estar ali. Isso vai funcionar?

solução!

Isso mesmo Thiago, como todos os parâmetros são opcionais o where 1=1 não influência na consulta e traz todos os registros, no caso de nenhum parâmetro ser passado.

Se apenas o nome for passado a consulta final será SELECT p FROM Produto p WHERE 1=1 AND p.nome = nome.

Sem colocar o where 1=1 teríamos quie ficar verificando em cada um dos ifs se o where já foi adicionado na consulta, pois o where é obrigatório quuando tiver algum parâmetro.

Beleza, obrigado!