2014-10-31 264 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); 

这将返回所有播放列表中包含未删除的视频。