Сортировать по имени AS C с Spring JPA - PullRequest
0 голосов
/ 10 июля 2020

Мне нужно отсортировать по имени по возрастанию, значения, поступающие из БД через JPA. Мне нужно отсортировать Categories, Subcategories (дочерние элементы объекта категории) и GlobalTags. Все три наследуются от класса Tag.

Это мой репозиторий:

@Repository
@Transactional
public interface TagDao extends JpaRepository<Tag, Long> {

    List<Tag> findTagsByNameAndTagType(String tagName, String tagType);
}
  

Это ServiceImpl из findAllTags().

        @Transactional(readOnly = true)
        @Override
        public ResponseGetTagsDto findAllTags() {
            Set<Tag> tags = new HashSet<>(tagDao.findAll());
            Set<Tag> globalTags = tags.stream().filter(tag -> GLOBAL == TagType.valueOf(tag.getTagType().toUpperCase())).collect(Collectors.toSet());
            Set<Tag> categoryTags = tags.stream().filter(tag -> CATEGORY == TagType.valueOf(tag.getTagType().toUpperCase())).collect(Collectors.toSet());
            Set<SubcategoryTag> subcategoryTags = tags.stream().filter(tag -> SUBCATEGORY == TagType.valueOf(tag.getTagType().toUpperCase())).map(SubcategoryTag.class::cast).collect(Collectors.toSet());
    
            log.info("found tags: {}", tags);
            return ResponseGetTagsDto.builder()
                    .globalTags(globalTags.stream()
                            .map(globalTag ->
                                    GlobalTagDto.builder()
                                            .id(globalTag.getId())
                                            .name(globalTag.getName())
                                            .tagType(globalTag.getTagType())
                                            .build()).collect(Collectors.toSet()))
                    .categoryTags(categoryTags.stream()
                            .map(ct -> CategoryTagDto.builder()
                                    .id(ct.getId())
                                    .name(ct.getName())
                                    .tagType(ct.getTagType())
                                    .subcategoryTags(subcategoryTags.stream()
                                            .filter(subcategoryTag -> subcategoryTag.getCategoryTag().getId().equals(ct.getId()))
                                            .map(subcategoryTag -> SubcategoryTagDto.builder()
                                                    .id(subcategoryTag.getId())
                                                    .name(subcategoryTag.getName())
                                                    .tagType(subcategoryTag.getTagType())
                                                    .parentTagId(ct.getId())
                                                    .build())
                                            .collect(Collectors.toSet())
                                    )
                                    .build())
                            .collect(Collectors.toSet())
                    )
                    .build();
        }

Я пытался сделайте что-нибудь вроде этого: [https://www.baeldung.com/spring-data-sorting], но я получаю несортированные данные при доступе к ним в Postman.

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Проблема заключалась в том, что я использовал Set для хранения данных после получения их из БД с помощью запроса JPA. Set не сохраняет упорядоченные данные.

0 голосов
/ 10 июля 2020

Я бы создал 3 разных репозитория, по одному для каждого тега.

@Repository
public interface GlobalTagRepository extends JpaRepository<GlobalTag, Long> { 
     Set<GlobalTag> findAllOrderByNameAsc();
}

И похожие репозитории для других. Затем вместо того, чтобы фильтровать его вручную, я бы

Set<GlobalTag> globalTags = new HashSet<>(GlobalTagRepository.findAllOrderByNameAsc());
Set<Category> categoryTags = new HashSet<>(CategoryTagRepository.findAllOrderByNameAsc());
Set<SubCategory> subCategoryTags= new HashSet<>(SubCategoryTagRepository.findAllOrderByNameAsc());

А затем поместил бы их на карту и вернул бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...