问题 在Spring Data Query中过滤子对象


我有以下域模型:

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,那么我只需要获取两个项目。


2611
2017-10-31 22:30


起源

我想你问的是类似于Hibernate FilterDef和Filter功能的东西。不幸的是,我不知道在spring数据jpa中使用类似的任何类似的简单方法。供参考: stackoverflow.com/questions/11619174/hibernate-filter-children - Vadim Kirilchuk


答案:


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

List<Playlist> findByPlaylistItemsVideoIsDeleted(boolean isDeleted);

并称之为:

playListRepository.findByPlaylistItemsVideoIsDeleted(false);

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


10
2018-03-16 17:30



你能解释一下这神奇地起作用吗?有没有提到jpa的描述? - judos


马克西姆,你可以使用 @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);
}

4
2017-10-31 22:47





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

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

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


1
2018-02-16 10:35