gpt4 book ai didi

java - JPA (@OneToMany) 查询不加入子表

转载 作者:行者123 更新时间:2023-11-29 12:32:34 27 4
gpt4 key购买 nike

我正在使用 JPA 和 Postgres 数据库编写服务。我有一个名为 Student 的类(class):

public class Student {
@id
private String id;

private String firstName;
private String lastName;

@OneToMany(targetEntity = Phone.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "student_id", referencedColumnName = "id")
private Set<Phone> phones;

// Setter and Getter
}

还有一个 Phone 类:

public class Phone {
@id
private String id;

private String number;

// Setter and Getter
}

现在我的数据库中将有两个表,下面是它们中的列:

学生:id, first_name, last_name

phone: id, number, student_id (由@JoinColumn生成)

现在每次我查询学生时,JPA 都会将电话表加入到学生表中,学生结果包含该学生的电话信息。这正是我想要的。

但是现在我遇到了一个问题。当我查询学生名单时,电话信息在这种情况下没有用,只有 id、firstName 和 lastName 是必需的。但是 JPA 也为我做了同样的“加入”操作。我知道这会消耗很多时间。在这种情况下,我怎么能只返回学生表中的信息呢?不加入电话表?

我在存储库中尝试过类似的东西

@Query(SELECT s.id, s.firstName, s.lastName FROM student s)
public List<Student> findAllStudentWithoutPhone();

但它返回值列表,但未转换为 Student 对象。我怎样才能实现这个功能?

最佳答案

在一对多映射中(请参阅下文),您已将获取类型设置为惰性 fetch = FetchType.LAZY 因此,hibernate 不会获取对应于学生的电话集,直到您通过 getter 方法访问电话集,因此无需担心。

@OneToMany(targetEntity = Phone.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "student_id", referencedColumnName = "id")
private Set<Phone>;

但是,如果您需要验证一切是否正常工作,您可以将属性 show_sql 设置为 true 并检查通过 hibernate 生成的 sql。

关于java - JPA (@OneToMany) 查询不加入子表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44535239/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com