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

Criar select para buscar dados de um dia específico

Olá, aprendemos no curso como gravar corretamente a data no mySql usando o spring, mas como podemos fazer uma busca no banco para todos os produtos lançados em uma data específica?

5 respostas

SELECT * FROM PRODUTOS WHERE DATA_LANCAMENTO='2018-10-31'

Obrigado pela resposta André. O problema que estou tendo é que quando passo como parâmetro para o select uma instância de um objeto do tipo Calendar, como é feito no curso, a busca não retorna nada. Imagino que seja por que ele passa a hora junto. Como faço pra busca me retornar só a parte da data?

Segue abaixo o meu select para buscar produtos lançados hoje:

public List<Produto> listarHoje() {
        return manager.createQuery("select p FROM  Produto p WHERE p.dataLancamento = :dataLancamento", Produto.class).setParameter("dataLancamento", Calendar.getInstance()).getResultList();
    }

Eu tentei usar o select passando como parâmetro uma instância do tipo Date, mas como o retorno da query popula uma lista de Produto então o tipo Date não é compatível.

Transforma esse seu objeto data em uma string 'yyyy-mm-dd' pra poder passar pro sql.

solução!

Olá Alexandre, tudo bem?

Realmente o objeto java.util.Calendar e o java.util.Date são genéricos e armazenam tanto a data como o horário. Para isso, o JPA disponibiliza uma forma para você dizer se o seu Date ou Calendar representa somente uma data, um horário ou uma data e um horário.

Quando você chama o método setParameter() existem diversas assinaturas do mesmo método e uma delas é onde você pode passar o nome do parâmetro, um objeto do tipo Calendar e um objeto TemporalType, que é o objeto onde iŕa dizer o que de fato esse Calendar representa. Esse é o método da classe Query:

Query setParameter(String name, Calendar value,
                       TemporalType temporalType);

No seu caso, poderia ser feito da seguinte forma:

public List<Produto> listarHoje() {
        return manager.createQuery("select p FROM  Produto p WHERE p.dataLancamento = :dataLancamento", Produto.class).setParameter("dataLancamento", Calendar.getInstance(), TemporalType.DATE).getResultList();
    }

Uma outra forma que você pode fazer é colocar essa mesma informação direto na sua entidade, dizendo que o atributo dataLancamento da entidade Produto representa apenas uma data, ficando assim:

@Entity
public class Produto {

    //outros atributos

    @Temporal(TemporalType.DATE)
    private Calendar dataLancamento;
}

Dessa forma, sempre que o JPA for utilizar o seu atributo dataLancamento ele vai tratar o mesmo contendo somente a data.

Espero ter ajudado. Bons estudos.

Obrigado pela ajuda.