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