我有以下域模型:
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,那么我只需要获取两个项目。
您所要做的就是在您的身上声明此方法 PlaylistRepository
接口:
List<Playlist> findByPlaylistItemsVideoIsDeleted(boolean isDeleted);
并称之为:
playListRepository.findByPlaylistItemsVideoIsDeleted(false);
这将返回所有未删除视频的播放列表。
马克西姆,你可以使用 @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);
}
您可以查看Spring Data Specifications。您可以通过调用repository.findAll(s)来使用它们;
规范允许您在查询中添加任意条件,包括要添加的过滤器。规格的另一个好处是它们可以是类型安全的。看这里:
http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#specifications