2014-12-19 2 views
14

Я пытаюсь определить метод в репозитории 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(); 
} 

Если я пытаюсь использовать запустить проект, я получаю следующую ошибку:

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property desc found for type Date! Traversed path: News.publicationDate.

И если я удалю Desc Я получаю это:

Caused by: java.util.NoSuchElementException

Что я делаю неправильно?

ответ

26

Оказывается, что подпись метода неверна. Право один:

findFirst5ByOrderByPublicationDateDesc() 

Есть немного запутанным, потому что в официальных образцах они имеют это:

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

Как вы можете видеть, что есть только один К там, обычно один.

1

Весна 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 может быть заменен любым количество записей, которые нужно возвращены

Смежные вопросы