使用投影检索子集的特定领域

问题描述 投票:0回答:1
   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.I试着这样做标签:

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

但是,这并不工作。如何可以检索每一个标签的名称,是属于输入到使用投影特定的帖子?先感谢您!

spring hibernate spring-boot spring-data-jpa projection
1个回答
0
投票

我的建议是避免使用Open Projections,除非你真的很需要那。请记住,有docs根据,采用开放式的预测时,Spring将不会优化您的查询。

春天的数据不能适用于这种情况的查询执行优化,因为规划环境地政司表示可以使用聚合根的任何属性。

上述(Java 8)解决方案将获取标记名称的Set从您的投影。

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());
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.