2014-10-31 156 views
7

我有以下域模型:過濾子對象

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 
} 

而且我的倉庫:

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

現在,怎麼辦我只返回一個僅包含現有視頻的播放列表,例如,如果數據庫中有三個視頻分配給該播放列表項目,並且其中一個視頻具有isDeleted集合爲true,那麼我只需要獲取兩個項目。

+0

我想你是在問一些類似於Hibernate FilterDef和Filter的功能。不幸的是,我不知道在spring數據jpa中使用類似的簡單方法。僅供參考:http://stackoverflow.com/questions/11619174/hibernate-filter-children – 2015-09-02 10:13:19

回答

2

馬克西姆,您可以使用@query註釋是這樣的:

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

甚至更​​好的方法:

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

所有你需要做的就是聲明你PlaylistRepository接口上這個方法:

List<Playlist> findByPlaylistItemsVideoIsDeleted(boolean isDeleted); 

,並調用它是這樣的:

playListRepository.findByPlaylistItemsVideoIsDeleted(false); 

這將返回所有播放列表中包含未刪除的視頻。