Entidades de consulta por datas e horas com o JPA de dados da primavera

Entidades de consulta por datas e horas com o JPA de dados da primavera

1. Introdução

Neste tutorial rápido, veremos como consultar entidades por datas com Spring Data JPA.

Primeiro, vamos refrescar nossa memória sobre como mapear datas e horas com JPA.

Então, vamos criar uma entidade com campos de data e hora, bem como um repositório Spring Data para consultar essas entidades.

2. Mapeando datas e horas com o JPA

Para começar,we’ll review a bit of theory about mapping dates with JPA. O importante é que precisamos decidir se queremos representar:

  • Apenas uma data

  • Apenas um tempo

  • Ou ambos

Além da anotação@Column (opcional), precisaremos adicionar a anotação@Temporal para especificar o que o campo representa.

Esta anotação leva um parâmetro que é um valor deTemporalType enum:

  • TemporalType.DATE

  • TemporalType.TIME

  • TemporalType.TIMESTAMP

Um artigo detalhado sobre o mapeamento de datas e horas com JPA pode ser encontradohere.

3. Na prática

Na prática, uma vez que nossas entidades estejam configuradas corretamente, não há muito trabalho para consultá-las usando o Spring Data JPA. Só temos que usarquery methods, @Query annotation.

Every Spring Data JPA mechanism will work just fine.

Vejamos alguns exemplos de entidades consultadas por datas e horas com Spring Data JPA.

3.1. Configurar uma entidade

Para começar, digamos que temos uma entidadeArticle, com uma data de publicação, uma hora de publicação e uma data e hora de criação:

@Entity
public class Article {

    @Id
    @GeneratedValue
    Integer id;

    @Temporal(TemporalType.DATE)
    Date publicationDate;

    @Temporal(TemporalType.TIME)
    Date publicationTime;

    @Temporal(TemporalType.TIMESTAMP)
    Date creationDateTime;
}

Dividimos a data e a hora da publicação em dois campos para fins de demonstração. Dessa forma, os três tipos temporais são representados.

3.2. Consultar as entidades

Agora que nossa entidade está configurada, vamos criar um Spring Datarepository para consultar esses artigos.

Vamos criar três métodos, usando vários recursos do Spring Data JPA:

public interface ArticleRepository
  extends JpaRepository {

    List
findAllByPublicationDate(Date publicationDate); List
findAllByPublicationTimeBetween( Date publicationTimeStart, Date publicationTimeEnd); @Query("select a from Article a where a.creationDateTime <= :creationDateTime") List
findAllWithCreationDateTimeBefore( @Param("creationDateTime") Date creationDateTime); }

Então, definimos três métodos:

  • findAllByPublicationDate que recupera artigos publicados em uma determinada data

  • findAllByPublicationTimeBetween que recupera artigos publicados entre duas horas fornecidas

  • efindAllWithCreationDateTimeBefore que recupera artigos criados antes de uma determinada data e hora

Os dois primeiros métodos contam com o mecanismo Spring Dataquery methods e o último com a anotação@Query.

No final das contas, isso não muda a forma como as datas serão tratadas. The first method will only consider the date part of the parameter.

O segundo considerará apenas o tempo dos parâmetros. E o último usará data e hora.

3.3. Teste as consultas

A última coisa que devemos fazer é configurar alguns testes para verificar se essas consultas funcionam conforme o esperado.

Primeiro importaremos alguns dados para nosso banco de dados e, em seguida, criaremos a classe de teste que verificará cada método do repositório:

@RunWith(SpringRunner.class)
@DataJpaTest
public class ArticleRepositoryIntegrationTest {

    @Autowired
    private ArticleRepository repository;

    @Test
    public void whenFindByPublicationDate_thenArticles1And2Returned() {
        List
result = repository.findAllByPublicationDate( new SimpleDateFormat("yyyy-MM-dd").parse("2018-01-01")); assertEquals(2, result.size()); assertTrue(result.stream() .map(Article::getId) .allMatch(id -> Arrays.asList(1, 2).contains(id))); } @Test public void whenFindByPublicationTimeBetween_thenArticles2And3Returned() { List
result = repository.findAllByPublicationTimeBetween( new SimpleDateFormat("HH:mm").parse("15:15"), new SimpleDateFormat("HH:mm").parse("16:30")); assertEquals(2, result.size()); assertTrue(result.stream() .map(Article::getId) .allMatch(id -> Arrays.asList(2, 3).contains(id))); } @Test public void givenArticlesWhenFindWithCreationDateThenArticles2And3Returned() { List
result = repository.findAllWithCreationDateTimeBefore( new SimpleDateFormat("yyyy-MM-dd HH:mm").parse("2017-12-15 10:00")); assertEquals(2, result.size()); assertTrue(result.stream() .map(Article::getId) .allMatch(id -> Arrays.asList(2, 3).contains(id)); } }

Cada teste verifica se apenas os artigos correspondentes às condições são recuperados.

4. Conclusão

Neste breve artigo, vimos como consultar entidades usando seus campos de datas e horas com Spring Data JPA.

Aprendemos um pouco de teoria antes de usar os mecanismos do Spring Data para consultar as entidades. Vimos que esses mecanismos funcionam da mesma maneira com datas e horas do que com outros tipos de dados.

O código-fonte deste artigo está disponívelover on GitHub.