Spring 使用投影检索子集合的特定字段 class Post{ @身份证 长id; 字符串标题; @ManyToMany(fetch=FetchType.LAZY, 级联={ cascade type.PERSIST, CascadeType.MERGE, }) @JoinTable(name=“post_标签”, joinColumns={@JoinColumn(name=“post_id”)}, inverseJoinColumns={@JoinColumn(name=“tag_id”)}) 设置标签; //建造师 //吸气剂 //二传手 } 类标签{ @身份证 长id 字符串名; //getter、setter、构造函数 } 界面后投影{ 长getId(); 字符串getTitle(); @值(“#{target.tags.size()}”) int getNumberOfTags(); }
在PostProjection中,我想检索属于此帖子的每个标签的名称。我可以得到一个特定帖子的标签数量,但不能得到标签的名称。我不想要标签id。我尝试过这样做:Spring 使用投影检索子集合的特定字段 class Post{ @身份证 长id; 字符串标题; @ManyToMany(fetch=FetchType.LAZY, 级联={ cascade type.PERSIST, CascadeType.MERGE, }) @JoinTable(name=“post_标签”, joinColumns={@JoinColumn(name=“post_id”)}, inverseJoinColumns={@JoinColumn(name=“tag_id”)}) 设置标签; //建造师 //吸气剂 //二传手 } 类标签{ @身份证 长id 字符串名; //getter、setter、构造函数 } 界面后投影{ 长getId(); 字符串getTitle(); @值(“#{target.tags.size()}”) int getNumberOfTags(); },spring,hibernate,spring-boot,spring-data-jpa,projection,Spring,Hibernate,Spring Boot,Spring Data Jpa,Projection,在PostProjection中,我想检索属于此帖子的每个标签的名称。我可以得到一个特定帖子的标签数量,但不能得到标签的名称。我不想要标签id。我尝试过这样做: class Post { @Id Long id; String title; @ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST,
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();
}
@Value(“#{target.tags.name}”)
我的建议是除非你真的需要,否则不要使用。记住,根据,当使用开放投影时,Spring不会优化您的查询
在这种情况下,Spring数据无法应用查询执行优化,
因为SpEL表达式可以使用聚合的任何属性
根
上面的解决方案()将从您的投影中获得一组标记名
@Value("#{target.tags.name}")
Set<String getTagsNanes();
导入静态java.util.stream.Collectors.toSet;
公共接口后投影{
字符串getTitle();
设置getTags();
默认设置getTagsNames(){
返回getTags().stream().map(Tag::getName).collect(toSet());
}
}
我的建议是避免使用,除非你真的需要。记住,根据,当使用开放投影时,Spring不会优化您的查询
在这种情况下,Spring数据无法应用查询执行优化,
因为SpEL表达式可以使用聚合的任何属性
根
上面的解决方案()将从您的投影中获得一组标记名
@Value("#{target.tags.name}")
Set<String getTagsNanes();
导入静态java.util.stream.Collectors.toSet;
公共接口后投影{
字符串getTitle();
设置getTags();
默认设置getTagsNames(){
返回getTags().stream().map(Tag::getName).collect(toSet());
}
}