有两个实体 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()列表排序?
答案 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);
}
这将为您提供预期的行为,同时具有动态分页和排序的功能。希望这可以帮助。干杯!