【问题标题】:Retriving specific field of child collection using projection使用投影检索子集合的特定字段
【发布时间】:2019-02-02 16:40:24
【问题描述】:
   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();

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

【问题讨论】:

    标签: spring hibernate spring-boot spring-data-jpa projection


    【解决方案1】:

    我的建议是避免使用Open Projections,除非你真的需要它。请记住,根据docs,当使用 Open Projections 时,Spring 不会优化您的查询。

    Spring Data 在这种情况下无法应用查询执行优化, 因为 SpEL 表达式可以使用聚合的任何属性 根。

    上述解决方案 (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());
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2014-06-08
      • 1970-01-01
      相关资源
      最近更新 更多