web-dev-qa-db-fra.com

Obtenez les derniers enregistrements classés par données sur Spring Data

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?

27

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.

52

Spring JPaRepository a une pagination qui peut être d'une grande aide. Cela fonctionnera également parfaitement

Pour renvoyer les 10 premiers enregistrements, vous pouvez utiliser:

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.

Pour renvoyer les 10 derniers enregistrements, vous pouvez utiliser:

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

11
Peter Mutisya