J'essaie de définir une méthode dans un référentiel Spring Data pour récupérer les derniers enregistrements d'une table classée par date. Ceci est mon entité:
@Entity
public class News {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private String title;
@Column(nullable = false)
private String text;
private Date publicationDate;
/* Getters and Setters */
}
Et voici mon référentiel:
public interface NewsRepository extends JpaRepository<News, Long> {
List<News> findFirst5OrderByPublicationDateDesc();
}
Si j'essaie d'utiliser le lancement du projet, j'obtiens l'erreur suivante:
Causée par: org.springframework.data.mapping.PropertyReferenceException: aucune propriété trouvée pour le type Date! Chemin parcouru: News.publicationDate.
Et si je retire le Desc, j'obtiens ceci:
Causé par: Java.util.NoSuchElementException
Qu'est-ce que je fais mal?
Il s'avère que la signature de la méthode était incorrecte. Le bon est:
findFirst5ByOrderByPublicationDateDesc()
Est un peu déroutant car dans les échantillons officiels, ils ont ceci:
List<User> findTop10ByLastname(String lastname, Pageable pageable);
Comme vous pouvez le voir, il n'y en a qu'un Par là, l'habituel.
Spring JPaRepository a une pagination qui peut être d'une grande aide. Cela fonctionnera également parfaitement
Créer un objet Pageable personnalisé
Pageable pageable = new PageRequest(0, 10, Sort.Direction.ASC, "id");
Page<News> topPage = newsRepository.findByPublicationDate(id, pageable);
List<News> topUsersList = topPage.getContent();
Dans l'interface NewsRepository, assurez-vous de créer une méthode
Page<News> findByPublicationDate(Date date, Pageable pageable);
Cela renverra les meilleurs enregistrements.
Pageable pageable = new PageRequest(0, 10, Sort.Direction.DESC, "id");
Page<News> bottomPage = newsRepository.findByPublicationDate(id, pageable);
// this is a list of the last 10 records, you can choose to invert it by using
List<News> bottomUsersList = bottomPage.getContent();
Collections.inverse(bottomUsersList);
Cela réutilisera le même NewsRespoitory, donc pas besoin de créer une autre méthode là-bas.
L'avantage d'utiliser des pages est qu'il devient flexible pour trier par une autre colonne. (ASC ou DESC)
// To get top by text
Pageable pageable = new PageRequest(0, 10, Sort.Direction.ASC, "text");
// Top by title
Pageable pageable = new PageRequest(0, 10, Sort.Direction.ASC, "title");
// Top by publicationDate
Pageable pageable = new PageRequest(0, 10, Sort.Direction.ASC, "publicationDate");
10 peuvent être remplacés par le nombre d'enregistrements dont vous avez besoin