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

标签 java postgresql jpa spring-boot

我正在使用 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/

相关文章:

java - Web 中 OpenJPA 错误的原因 - 使用托管事务时无法访问 EntityTransaction

postgresql - 如何为 PostgreSQL 设置千位分隔符?

java - 提供商链未获取 AWS 凭证文件

java - 如何使用日历生成开始和结束时间?

java - 为什么我的 Java 序列化在单次转换和多次转换方面表现不佳?

sql - Postgres - 使用 DISTINCT ON 获得第一行,但也获得 COUNT(*) 工作

python - 如何使用 psycopg2 以编程方式获取表结构

java - 如何使用 Spring security 从 Spring Data JPA 加载经过身份验证的用户实体模型以在其他 JPA 存储库中使用?

oracle - 使用 JPA 时如何设置 Oracle NLS_LANG

java - 使用 Spring Boot 进行 Jersey 多部分配置