Как отсортировать связанный объект в отношении @ManyToMany - PullRequest
0 голосов
/ 01 июля 2019

Есть две сущности POST и TAG , они связаны отношением "многие ко многим".

Post

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

Tag

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

В зависимости от того, какой Tag я выбрал, должны отображаться все сообщения, зависящие от него.Все сообщения должны отображаться с использованием разбиения на страницы и сортировки, которые выбирает пользователь.

Проблема заключается в том, что сортировка и разбиение на страницы игнорируются.

Моя первая попытка

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 голосов
/ 02 июля 2019

Кажется, ваша первая попытка исправлена, но, как мне кажется, у вас две пропущенные точки.

Во-первых, вы обязательно должны сделать запрос на получение сообщений из репозитория постов, предоставив данные для подкачки.

Второй вариант - для этого вы должны определить 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);

}

Это обеспечит ожидаемое поведение способностями динамической подкачки и сортировки . Надеюсь это поможет. Ура!

0 голосов
/ 01 июля 2019

Попробуйте с аннотацией OrderBy

@ManyToMany(mappedBy = "tags")
@JsonIgnore
@OrderBy("direction")
private List<Posts> posts = new ArrayList<>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...