如何对@ManyToMany关系中的相关实体进行排序

时间:2019-07-01 16:56:18

标签: java spring sorting

有两个实体 POST TAG ,它们之间存在多对多关系。

发布

@ManyToMany
@JoinTable(name = "posts_tags",
joinColumns = @JoinColumn(name = "post_id"),
inverseJoinColumns = @JoinColumn(name = "tag_id"))
private List<Tags> tags = new ArrayList<>();

标记

@ManyToMany(mappedBy = "tags")
@JsonIgnore
private List<Posts> posts = new ArrayList<>();

根据我选择的标签,应该向我显示所有依赖他的帖子。 所有帖子应使用用户选择的分页和排序方式进行显示。

  

问题是排序和分页被忽略了。

我的第一次尝试

public Page<Posts>  getPostsByTag(String tag, Integer page, Integer size, String sort, String dir){
    Tags tags = tagsRepository.findByTagName(tag);

    Pageable pageable = PageRequest.of(page,size, dir.equals("asc") ? Sort.Direction.ASC : Sort.Direction.DESC,sort);

    return new PageImpl<>(tags.getPosts(),pageable,tags.getPosts().size());
}

第二次尝试

public Page<Posts>  getPostsByTag(String tag, Integer page, Integer size, String sort, String dir){
    Tags tags = tagsRepository.findByTagName(tag);    

    PagedListHolder pagedListHolder = new PagedListHolder(tags.getPosts());
    pagedListHolder.setPage(page);
    pagedListHolder.setPageSize(size);
    pagedListHolder.setSort(new MutableSortDefinition(sort, true ,dir.equals("asc")));

    return new PageImpl<>(pagedListHolder.getPageList());
}

在第二次尝试中,分页有效,但排序无效。 如何获得 tags.getPosts()列表排序?

2 个答案:

答案 0 :(得分:0)

尝试使用OrderBy注释

@ManyToMany(mappedBy = "tags")
@JsonIgnore
@OrderBy("direction")
private List<Posts> posts = new ArrayList<>();

答案 1 :(得分:0)

您的第一次尝试似乎可以纠正,但是我想您有两个缺失点。

第一个是,您绝对应该通过提供分页详细信息进行查询,以从帖子存储库中获取帖子。

第二个是为了执行此操作,您应该在存储库中将Pageable定义为参数。

@Repository
public interface PostDao extends JpaRepository<Posts, UUID> {

    public Page<Posts> findByTagsName(String name, Pageable pageable);

}

之后,您可以使用服务中的存储库,如下所示:

@Override
public Page<Posts> getPostsByTag(String tag, Integer page, Integer size, String sort, String dir) {

    PageRequest request = PageRequest.of(page, size, Direction.fromString(dir), sort);

    return postDao.findByTagsName(tag, request);

}

这将为您提供预期的行为,同时具有动态分页排序的功能。希望这可以帮助。干杯!