web-dev-qa-db-fra.com

Filtrer un objet enfant dans la requête de données de printemps

J'ai un modèle de domaine suivant:

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
}

Et mon référentiel:

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

Maintenant, comment puis-je renvoyer une liste de lecture contenant uniquement des vidéos existantes, c.-à-d. Si la base de données contient trois vidéos affectées à cet élément de liste de lecture et que l'une de ces vidéos est définie sur true, alors je n'ai besoin que de deux éléments.

12
Maksim

Tout ce que vous avez à faire est de déclarer cette méthode sur votre interface PlaylistRepository:

List<Playlist> findByPlaylistItemsVideoIsDeleted(boolean isDeleted);

Et appelez ça comme ça:

playListRepository.findByPlaylistItemsVideoIsDeleted(false);

Cela renverra toutes les listes de lecture avec des vidéos non supprimées.

11
inafalcao

Maksim, vous pouvez utiliser l'annotation @query comme ceci:

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

Ou encore mieux:

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

Vous pouvez consulter les spécifications de données de printemps. Vous les utilisez en appelant repository.findAll (s);

Les spécifications vous permettent d'ajouter des conditions arbitraires à votre requête, y compris le filtre que vous souhaitez ajouter. Une autre bonne chose à propos des spécifications est qu’elles peuvent être sécurisées contre le type. Vois ici:

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

1
Michael Tontchev