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.