在Spring Data Query中过滤子对象

我有以下域模型:

Playlist – > List – > Video

 @Entity class Playlist{ // id, name, etc List 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 { List findAll(); } 

现在,如何返回仅包含现有video的播放列表,即如果分配给该播放列表项目的数据库中有三个video,并且其中一个video的isDeleted设置为true,那么我只需要获取两个项目。

您所要做的就是在PlaylistRepository接口上声明此方法:

 List findByPlaylistItemsVideoIsDeleted(boolean isDeleted); 

并称之为:

 playListRepository.findByPlaylistItemsVideoIsDeleted(false); 

这将返回所有未删除video的播放列表。

Maksim,您可以像这样使用@query注释:

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

甚至更好的方式:

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

您可以查看Spring Data Specifications。 您可以通过调用repository.findAll(s)来使用它们;

规范允许您在查询中添加任意条件,包括要添加的filter。 规格的另一个好处是它们可以是类型安全的。 看这里:

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