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?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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.