codecentric

Spring Data – Teil 1: Commons

Mit dem Spring Data Projekt verfolgt SpringSource das Ziel, ein gemeinsames API sowohl für den Zugriff auf NoSQL-Datastores als auch altbewährte relationale Datenbanken bereitzustellen. Spring Data ist ein Mantelprojekt, das neben allgemeinen Aspekten – wie etwa dem Blättern in großen Datenmengen – Unterprojekte für die verschiedenen Arten von Persistenz-Technologien umfasst.

In einer losen Serie von Blog-Einträgen möchte ich jeweils ausgewählte Aspekte aus den einzelnen Data-Projekten vorstellen. Beginnen möchte ich mit

Spring Data Commons

Das Projekt Spring Data Commons stellt allgemeine Infrastruktur und Interfaces für die anderen, konkreteren Data-Projekte zur Verfügung. Unabhängig von der Art des Datastores unterstützt Spring Data mit einem einheitlichen API folgende Aspekte:

  • Ausführen von CRUD (create, read, update, delete) Operationen
  • Sortierung
  • Seitenweises Lesen (Pagination)


Von zentraler Bedeutung sind dabei die Interfaces im Package org.springframework.data.repository:

Bei dem Interface Repository handelt es sich lediglich um ein Marker-Interface, interessanter wird es beim CrudRepository. Dieses definiert einheitlich die allseits beliebten CRUD-Operationen (Create, Read, Update und Delete). Eine weitere Spezialisierung PagingAndSortingRepository bietet allgemeine Finder-Methoden an, die Sortierung und Blättern unterstützen. Allen Interfaces ist gemein, dass sie mittels Generics eine Typisierung der Entität sowie des Suchschlüssels vornehmen.

Für die folgenden Beispiele soll User unser persistentes Domain-Objekt sein, dass einen Schlüssel vom Typ String hat.

Sortierung

Unser User-Repository definieren wir wie folgt …

public interface UserRepository extends PagingAndSortingRepository<User, String> {
}

… und verwenden es anschließend, um nach den zwei Attributen id und fullName aufsteigend bzw. absteigend zu suchen:

@Autowired UserRepository userRepo;
...
public Iterable<User> getSortedUsers() {
	return userRepo.findAll( new Sort(
		 new Sort.Order(Sort.Direction.ASC, "id"),
		 new Sort.Order(Sort.Direction.DESC, "fullName")
		 )
	);
}

Pagination

Auch das Blättern gestaltet sich sehr komfortabel:

Page<User> page = userRepo.findAll( new PageRequest(2, 20) );
List<User> users = page.getContent();	 
...

Im obigen Beispiel verwenden wir eine Blockgröße von 20 und fragen den 2. Block an. Ein Page-Objekt stellt neben den eigentlichen Suchergebnissen auch Informationen über Gesamtanzahl an Treffern, aktueller Seite und einigem mehr bereit.

Ausblick

Im Rahmen dieser Blog-Serie werden wir auf konkrete Spring Data Projekte wie Spring Data JPA und Spring Data MongoDB in Hinblick auf Konfiguration, Verwendung des APIs sowie Spezifika der Subprojekte eingehen.

Persist you must, Master Yoda says.

  • Facebook
  • Delicious
  • Digg
  • StumbleUpon
  • Mister Wong
  • Reddit
  • Instapaper
  • Technorati
  • Blogger
Tobias Trelle

 

Weitere Beiträge aus dem codecentric Blog

5 Antworten auf Spring Data – Teil 1: Commons

  1. Quick question on sorting and paging – is there a way to combine the two? What I mean is I want to do a find which is both sorted and paged.
    Thanks for the interesting article.
    Eugen.

  2. Have a look at the Pageable interface and its implementation PageRequest. There is a constructor for the latter that takes a Sort object.

    Please also have a look at the Spring Data JPA post:
    http://blog.codecentric.de/en/2012/01/spring-data-jpa/

  3. Vishal sagt:

    hi,

    How can we add specifications in find All with use of named queries and Still get a Pageable object?
    I need to make use of pageable api from spring to retun my search result.

    Please advice.
    thanks
    Vishal

    • Hi Vishal,

      the PagingAndSortingRepository offers a method

      Page findAll(Pageable pageable);

      that supports paging for all records within a namespace (table, collection etc.). You don’t have to write your own query for that.

      HTH
      Tobias

  4. Sameer sagt:

    That was really nice. To me it was far more effective in understanding the spring-data concept than the documentation at springsource. :)

    Thanks a lot.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>