在 Spring 数据查询中筛选子对象

2022-09-03 00:01:42

我有一个以下领域模型:

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

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


答案 1

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

List<Playlist> findByPlaylistItemsVideoIsDeleted(boolean isDeleted);

并这样称呼它:

playListRepository.findByPlaylistItemsVideoIsDeleted(false);

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


答案 2

您可能已经解决了这个问题,但我想我会贡献这个,希望它可以帮助您或访问此页面的任何其他人。

使用春季 JPA 规范,您将:

  1. 使您能够使用 JPA 规范PlaylistRepository
  2. 将 编写为可重用方法Specification
  3. 利用 作为查询Specification

以下是详细信息。

1. 实施JpaSpecificationExecutor

更新以实现 。这会将接受参数的方法添加到 .PlaylistRepositoryJpaSpecificationExecutorfind*Specification<T>PlaylistRepository

public interface PlaylistRepository extends JpaRepository<Playlist, Long>, 
            JpaSpecificationExecutor<Playlist> {

}

2. 创建Specification

使用静态方法创建一个类,用于创建可重用的 .Specification

public final class PlaylistSpecifications {

    private PlaylistSpecifications() {}

    public static Specification<Playlist> hasExistingVideos() {
        return (root, query, cb) -> {
            return cb.equal(root.join("playlistItems").join("video")
                    .get("isDeleted"), false);
        };
    }
}

使用(以及随后的使用)类似于在 SQL 中使用。在这里,我们在类的字段上连接,而不是在表的列上连接。root.joinjoinJOIN

3. 发出查询

我不知道你打算如何发出你的查询,但下面是如何在“服务”类中完成它的示例:

@Service
public class PlaylistService {

    @Autowired
    private PlaylistRepository playlistRepository;

    public List<Playlist> findPlaylistsWithExistingVideos() {

        Specification<Playlist> spec = PlaylistSpecifications.hasExistingVideos();
        return playlistRepository.findAll(spec);
    }
}

希望这有帮助!


推荐