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

时间:2019-02-02 16:40:25

标签: spring hibernate spring-boot spring-data-jpa 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我想以检索每个标签的名称,是属于这个职位。我能够得到的标记特定职位的数量,但没有标记的名称。我不想要标签ID。我尝试这样做:

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

但这不起作用。 如何使用投影检索每个标签所属的名称输入到特定帖子?预先谢谢你!

1 个答案:

答案 0 :(得分:0)

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

  

弹簧中的数据不能在这种情况下应用的查询执行优化,   因为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());
    }

}