如何使用Spring数据JPA过滤OneToMany字段?

如何使用Spring数据JPA过滤OneToMany字段?,jpa,spring-data-jpa,spring-data,one-to-many,Jpa,Spring Data Jpa,Spring Data,One To Many,我试图根据帖子是否被设置为隐藏,过滤掉与某个类别相关的帖子 我可以用查询后过滤器很好地实现这一点(见下文),但我想知道是否可以使用JPA方法构造查询?(特别是像FindAllBy…这样的查询构建方法,我希望通过坚持这些类型的查询来保持数据库的不可知性) 我也可以在PostRepository上调用FindAllByCategory并以这种方式构建返回,但它感觉很粗糙和落后 总之,我想找到一种方法来声明findallandFilterPostsBysHidden(布尔isHidden) 类别类 @

我试图根据帖子是否被设置为隐藏,过滤掉与某个类别相关的帖子

我可以用查询后过滤器很好地实现这一点(见下文),但我想知道是否可以使用JPA方法构造查询?(特别是像FindAllBy…这样的查询构建方法,我希望通过坚持这些类型的查询来保持数据库的不可知性)

我也可以在PostRepository上调用FindAllByCategory并以这种方式构建返回,但它感觉很粗糙和落后

总之,我想找到一种方法来声明findallandFilterPostsBysHidden(布尔isHidden)

类别类

@Entity
public class Category {

    public Category(String name, Post... posts) {
        this.name = name;
        this.posts = Stream.of(posts)
            .collect(Collectors.toSet());
        this.posts.forEach(post -> post.setCategory(this));
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String name;

    @OneToMany(mappedBy = "category")
    private Set<Post> posts;
}
现在我这样做是为了过滤CategoryController中与类别相关的帖子

@GetMapping
    public List<Category> list(Authentication authentication) {
        boolean canViewHidden = securityService.hasAuthority(Permissions.Post.VIEWHIDDEN, authentication.getAuthorities());
        List<Category> categories = categoryRepository.findAll();
        categories.forEach(
            category -> {
                Set<Post> filteredPosts = category.getPosts().stream()
                    .filter(post -> canViewHidden || !post.isHidden())
                    .collect(Collectors.toSet());
                category.setPosts(filteredPosts);
            }
        );
        return categories;
    }
@GetMapping
公共列表(身份验证){
布尔值canViewHidden=securityService.hasAuthority(Permissions.Post.VIEWHIDDEN,authentication.getAuthories());
List categories=categoryRepository.findAll();
类别。forEach(
类别->{
设置filteredPosts=category.getPosts().stream()
.filter(post->canViewHidden | | |!post.ishiden())
.collect(收集器.toSet());
类别.设置柱(过滤柱);
}
);
退货类别;
}

我会尝试在JPA存储库中为Post类使用自定义查询,如下所示:

@Query(value = "SELECT p FROM Post p INNER JOIN Category c ON p.id = c.post.id "
        + "WHERE p.hidden = false AND c.id = :id")
List<Post> findViewablePostsByCategory(@Param("id") Long categoryId);
@Query(value=“在p.id=c.Post.id上从Post p内部连接类别c中选择p”
+“其中p.hidden=false,c.id=:id”)
列出findViewablePostsByCategory(@Param(“id”)长类别id);

我知道这可能不是您想要的确切方法,但正如K.Nicholas指出的,没有办法将联接与JPA存储库的查询构建方法结合使用。

我认为存储库不直接支持联接。感谢您的建议,正如我所说的,我担心数据库不可知,所以我可能会坚持使用java代码进行过滤,尽管在本例中它不那么优雅。这不是一个本机查询,而是一个jdbc查询,这意味着您可以将它用于任何关系数据库。
@Query(value = "SELECT p FROM Post p INNER JOIN Category c ON p.id = c.post.id "
        + "WHERE p.hidden = false AND c.id = :id")
List<Post> findViewablePostsByCategory(@Param("id") Long categoryId);