【问题标题】:How to get only ids in @ManyToMany mapping, without referencing the whole object?如何在 @ManyToMany 映射中仅获取 id,而不引用整个对象?
【发布时间】: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&lt;Course&gt; likedCourses;

标签: java hibernate jpa


【解决方案1】:

您可以使用以下 JPQL 查询来完成:

SELECT c.id
FROM Student s JOIN s.likedCourses c
WHERE s.id = :id

但是,不幸的是,我看到 Hibernate 生成了与课程表的额外连接。如果您对此有疑问,可以按照@TimBiegeleisen 的建议使用本机 SQL 查询。

【讨论】:

  • 假设您显示课程列表并允许用户喜欢或不喜欢课程。您需要检查学生是否已经喜欢某些课程,对吗?哪个? “在实践中,仅获取 ID 是没有意义的。”我会说理论上获取ID是没有意义的。在实践中,您会获取整个对象列表来检查登录学生的喜欢/不喜欢课程的状态吗?
  • 另外,为什么不简单:SELECT c.id FROM course_like WHERE s.id = :id
  • 确实如此。我删除了那部分。仅当您使用专用的 course_like 实体将 @ManyToMany 关系拆分为两个 @ManyToOne 时,您才能在 JPQL 中执行 SELECT ... FROM course_like。对于 @ManyToMany,没有可供选择的 course_like 实体。
猜你喜欢
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 2020-03-08
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多