2014-10-31 22 views
7

Ich habe ein folgendes Domain-Modell:Filter Kind-Objekt in Spring Data Query

Playlist ->List<PlaylistItem> ->Video

@Entity 
class Playlist{ 
    // id, name, etc 
    List<PlaylistItem> playlistItems; 
    // getters and setters 
} 


@Entity 
class PlaylistItem{ 
    // id, name, etc. 
    Video video; 
    // getters and setters 
} 


@Entity 
class Video{ 
    // id, name, etc. 
    boolean isDeleted; 
    // getters and setters 
} 

Und meinen Repository:

public interface PlaylistRepository extends JpaRepository<Playlist, Long> { 
    List<Playlist> findAll(); 
} 

Nun, wie Ich gebe eine Playlist mit nur vorhandenen Videos zurück, dh wenn der Playlist-Datei drei Videos in der Datenbank zugeordnet sind und eines dieser Videos isDeleted gesetzt ist um wahr zu sein, dann muss ich stattdessen nur zwei Gegenstände bekommen.

+0

Ich denke, Sie fragen nach etwas Ähnliches wie Hibernate FilterDef und Filter-Funktionalität. Leider kenne ich den einfachen Weg nichts vergleichbares im Frühling zu verwenden. Jpa. FYI: http://stackoverflow.com/questions/11619174/hibernate-filter-children –

Antwort

2

Maksim, könnten Sie die @query Anmerkung wie folgt verwenden:

public interface PlaylistRepository extends JpaRepository<Playlist, Long> { 
    @Query("select playlist from Playlist playlist 
      fetch join playlist.playlistItems itens 
      fetch join itens.video as video 
      where video.isDeleted = false") 
    List<Playlist> findAll(); 
} 

Oder noch besser:

public interface PlaylistRepository extends JpaRepository<Playlist, Long> { 
    @Query("select playlist from Playlist playlist 
      fetch join playlist.playlistItems itens 
      fetch join itens.video as video 
      where video.isDeleted = :hasVideo ") 
    List<Playlist> findPlayList(@Param("hasVideo") boolean hasVideo); 
} 
0

Sie in Spring Data Spezifikationen aussehen kann. Sie verwenden sie, indem Sie repository.findAll (s) aufrufen.

Mit den Spezifikationen können Sie beliebige Bedingungen zu Ihrer Abfrage hinzufügen, einschließlich des Filters, den Sie hinzufügen möchten. Eine weitere nette Sache über Spezifikationen ist, dass sie typsicher sein können. Siehe hier:

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#specifications

6

Alles, was Sie tun müssen, ist diese Methode erklären auf PlaylistRepository Schnittstelle:

List<Playlist> findByPlaylistItemsVideoIsDeleted(boolean isDeleted); 

Und nennen es dies wie:

playListRepository.findByPlaylistItemsVideoIsDeleted(false); 

Das ist alles zurückkehren Playlist mit Videos, die nicht entfernt werden.