2014-12-19 13 views
14

Próbuję zdefiniować metodę w repozytorium danych Spring, aby pobrać ostatnie rekordy w tabeli uporządkowanej według daty. To jest moja jednostka:Uzyskaj ostatnie rekordy uporządkowane według danych 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 */ 
} 

I to jest mój repozytorium:

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

Jeśli próbuję użyć uruchomienia projektu I uzyskać następnego błędu:

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

a jeśli usunę Desc Otrzymuję to:

Caused by: java.util.NoSuchElementException

Co robię źle?

Odpowiedz

26

Okazuje się, że podpis metody był nieprawidłowy. Prawo jest jedno:

findFirst5ByOrderByPublicationDateDesc() 

jest trochę mylące, ponieważ w oficjalnych próbek muszą to:

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

Jak widać istnieje tylko jeden By tam, zwykle jeden.

1

Wiosną JPaRepository ma paginację, która może być bardzo pomocne. Będzie to również działa idealnie

Aby powrócić top 10 rekordów, można użyć:

Tworzenie niestandardowego stronicowalnej obiekt

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

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

W NewsRepository interfejsu, należy utworzyć metodę

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

Spowoduje to wyświetlenie najlepszych rekordów.

Aby powrócić ostatnich 10 rekordów, można użyć:

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

To będzie używać tego samego NewsRespoitory, więc nie ma potrzeby, aby stworzyć tam inną metodę.

Zaletą korzystania ze stron jest możliwość sortowania według innej kolumny. (ASC lub DESC Albo)

// 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 może być zastąpiona przez co liczba rekordów czego potrzebujesz powrócił

Powiązane problemy