Извлечение определенного поля дочерней коллекции с использованием проекции - PullRequest
0 голосов
/ 02 февраля 2019
   class Post {
  @Id
  Long id;
  String title;
 @ManyToMany(fetch = FetchType.LAZY,
                cascade = {
                    CascadeType.PERSIST,
                    CascadeType.MERGE,

                })
        @JoinTable(name = "post_tags",
                joinColumns = { @JoinColumn(name = "post_id") },
                inverseJoinColumns = { @JoinColumn(name = "tag_id") })

    Set<Tag> tags;
// constructor
// getters
// setters
}

class Tag{
   @Id
   Long id
   String name;
// getters, setter, constructor
}

interface PostProjection{
     Long getId();
     String getTitle();
 @Value("#{target.tags.size()}")
     int  getNumberOfTags();

}

В PostProjection я хотел бы получить название каждого тега, принадлежащего этому посту.Я могу получить количество тегов для определенного сообщения, но не имя тега.Я не хочу тег id. Я пытался сделать это:

 @Value("#{target.tags.name}")
         Set<String getTagsNanes();

Но это не работает.Как можно получить имя каждого тега, принадлежащего к конкретному сообщению, используя проекцию?Заранее спасибо!

1 Ответ

0 голосов
/ 02 февраля 2019

Мой совет: не используйте Открытые проекции , если только вам это не нужно.Помните, что, согласно документам , при использовании открытых проекций Spring не будет оптимизировать ваш запрос.

Spring Data не может применить оптимизации выполнения запроса в этом случае, поскольку выражение SpEL можетиспользуйте любой атрибут совокупного корня.

Приведенное выше решение ( Java 8 ) получит Набор имен тегов из вашей проекции.

import static java.util.stream.Collectors.toSet;

public interface PostProjection {
    String getTitle();

    Set<Tag> getTags();

    default Set<String> getTagsNames() {
        return getTags().stream().map(Tag::getName).collect(toSet());
    }

}
...