使用投影检索子集合的特定字段

Retriving specific field of child collection using projection

   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 中,我想检索属于此 post 的每个标签的名称。我能够获取特定 post 的标签数量,但不能获取标签名称。我不希望标签 id.I 尝试这样做:

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

但这不起作用。 如何使用投影检索属于特定 post 的每个标签的名称?提前致谢!

我的建议是避免使用 Open Projections unless you really need that. Remember that, according with docs,在使用 Open Projections 时,Spring 不会优化您的查询。

Spring Data cannot apply query execution optimizations in this case, because the SpEL expression could use any attribute of the aggregate root.

上面的解决方案(Java 8) will get a 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());
    }

}