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?
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?
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.
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.