有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

不连接子表的java JPA(@OneToMany)查询

我在为JPA和Postgres db写服务。我有一个班叫Student:

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
}

还有电话课:

public class Phone {
    @id
    private String id;

    private String number;

    // Setter and Getter
}

现在,my db中将有两个表,其中有以下列:

学生:身份证,名,姓

电话:id,号码,学生id(由@JoinColumn生成)

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

但现在我遇到了一个问题。当我查询学生名单时,电话信息在这种情况下并不有用,只需要id、名字和姓氏。但JPA也为我做同样的“加入”操作。我知道这会耗费很多时间。在这种情况下,我如何才能返回学生表中的信息?不参加电话会议

我在存储库中尝试了一些东西,比如

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

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


共 (1) 个答案

  1. # 1 楼答案

    在一对多映射(见下文)中,您将fetch类型设置为lazyfetch=FetchType。LAZY因此,在通过getter方法访问手机集之前,hibernate不会获取与该学生对应的手机集,因此无需担心

    @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