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();
}
}