【发布时间】:2021-12-30 09:28:53
【问题描述】:
我正在学习 baeldung 的教程: https://www.baeldung.com/jpa-many-to-many
第一个例子就是我需要的:
示例展示了如何在 User 类中添加关系:
@ManyToMany
@JoinTable(
name = "course_like",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id"))
Set<Course> likedCourses;
我的情况不同的是,我在获取数据时不需要访问整个对象。 我只需要返回一组 Id。
1.) 我已尝试使用 @ElementCollection 的选项:
@ManyToMany
@JoinTable(
name = "course_like",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id"))
Set<Course> likedCourses;
@ElementCollection
@CollectionTable(
name = "course_like",
joinColumns = @JoinColumn(name = "student_id"))
Set<Long> likedCourses;
2.) 另外,返回整个对象,在中迭代和存储 id, 和
3.) @Transient 和@PostLoad 还有第三个选项
public Set<Course> likedCourses;
@Transient
public Set<Long> courseIds;
@PostLoad
private void postLoad() {
courseIds = likedCourses.stream().map(Course::getId).collect(Collectors.toSet());
}
我正在寻找最优化的方法,在我看来选项 #3 并不好,因为它可能会多次调用 @Postload。
你会怎么做呢?谢谢!
【问题讨论】:
-
我建议只编写一个自定义 JPA 或本机查询,它只选择您想要的列。这将避免加载整个实体。
-
我也是这么想的。所以课堂上就会有这个,对吧?
@JsonIgnore @ManyToMany @JoinTable( name = "course_like", joinColumns = @JoinColumn(name = "student_id"), inverseJoinColumns = @JoinColumn(name = "course_id")) Set<Course> likedCourses;