wake-up-neo.com

Untergeordnetes Objekt in Spring Data Query filtern

Ich habe ein folgendes Domainmodell:

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 mein Repository:

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

Wie gebe ich nun eine Wiedergabeliste mit nur vorhandenen Videos zurück? Wenn also drei Videos in der Datenbank diesem Wiedergabelistenelement zugeordnet sind und eines dieser Videos isDeleted auf true gesetzt hat, muss ich stattdessen nur zwei Elemente abrufen.

12
Maksim

Alles was Sie tun müssen, ist diese Methode auf Ihrer PlaylistRepository-Schnittstelle zu deklarieren:

List<Playlist> findByPlaylistItemsVideoIsDeleted(boolean isDeleted);

Und nenne es so:

playListRepository.findByPlaylistItemsVideoIsDeleted(false);

Daraufhin werden alle Wiedergabelisten mit Videos angezeigt, die nicht entfernt wurden.

11
inafalcao

Maksim, Sie könnten die Annotation @query folgendermaßen 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);
}
5
Diogo Calazans

Sie können die Spring Data-Spezifikationen einsehen. Sie verwenden sie, indem Sie repository.findAll (s) aufrufen.

Mithilfe von Spezifikationen können Sie Ihrer Abfrage beliebige Bedingungen hinzufügen, einschließlich des Filters, den Sie hinzufügen möchten. Eine weitere schöne Sache der Spezifikationen ist, dass sie typensicher sein können. Siehe hier:

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

1