web-dev-qa-db-ja.com

Spring Dataのデータ順に並べられた最後のレコードを取得する

Spring Dataリポジトリにメソッドを定義して、日付順に並べられたテーブルの最後のレコードを取得しようとしています。これは私のエンティティです:

@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 */
}

そして、これは私のリポジトリです:

public interface NewsRepository extends JpaRepository<News, Long> {
    List<News> findFirst5OrderByPublicationDateDesc();
}

プロジェクトの起動を使用しようとすると、次のエラーが表示されます。

原因:org.springframework.data.mapping.PropertyReferenceException:タイプDateのプロパティディスクが見つかりません!通過したパス:News.publicationDate。

そして、Descを削除すると、これが得られます:

原因:Java.util.NoSuchElementException

私が間違っているのは何ですか?

27

メソッドの署名が間違っていたことがわかりました。正しいものは:

findFirst5ByOrderByPublicationDateDesc()

公式サンプルでは次のようになっているため、少し混乱しています。

List<User> findTop10ByLastname(String lastname, Pageable pageable);

ご覧のとおり、たった1つしかありません。

52

Spring JPaRepositoryにはページネーションがあり、これは非常に役立ちます。これも完全に機能します

上位10件のレコードを返すには、次を使用できます。

カスタムのページング可能オブジェクトを作成する

Pageable pageable = new PageRequest(0, 10, Sort.Direction.ASC, "id");

Page<News> topPage = newsRepository.findByPublicationDate(id, pageable);
List<News> topUsersList = topPage.getContent();

NewsRepositoryインターフェースで、必ずメソッドを作成してください

 Page<News> findByPublicationDate(Date date, Pageable pageable);

これにより、上位のレコードが返されます。

最後の10レコードを返すには、次を使用できます。

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);

これは同じNewsRespoitoryを再利用するため、そこで別のメソッドを作成する必要はありません。

ページを使用する利点は、別の列で並べ替えることが柔軟になることです。 (ASCまたは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は、必要な数のレコードで置き換えることができます

11
Peter Mutisya