使用 Hibernate 5.4 从 SQL 查询中读入嵌套对象

Read into nested object from SQL query using Hibernate 5.4

Hibernate 新手。我有以下设置:

@Entity
@Table(name = "primary_doctor")
public class PrimaryDoctor {
    @Id
    private Long rid;

    @OneToOne
    @JoinColumn(name = "pid")
    private Patient patient;

    @OneToOne
    @JoinColumn(name = "did")
    private Doctor doctor;
}
@Entity
@Embeddable
public class Doctor {

    @Id
    private Long did;
    String name;
    String phone;
}
@Entity
public class Patient {

    @Id
    private Long pid;
    String name;
    String gender;
    String height;
    String birthDate;
}

我想通过查询 primary_doctor table 得到一个 Doctor 对象。我知道我可以加入两个 table 中的 did,但我觉得如果我这样做,我就没有使用 Hibernate 对象映射。你能指导我如何正确地做到这一点吗? 这是我拥有的:

EntityManager entityManager = ...
entityManager.getTransaction().begin();
String sqlQuery = "SELECT * FROM DOCTOR WHERE DID = (SELECT DID FROM PRIMARY_DOCTOR WHERE pid = " + pid + ");";
Query q = entityManager.createNativeQuery(sqlQuery);
Object[] resultRow = (Object[]) q.getResultList().get(0);
String doctorName = (String) resultRow[1];

我还有一个 persistence.xml 文件如下:

<persistence-unit name="test">
        <class>model.Patient</class>
        <class>model.Doctor</class>
        <class>model.PrimaryDoctor</class>
...

我没有 cfg 文件。我需要那个吗?

我的 Hibernate 版本:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.4.31.Final</version>
</dependency>

我正在为数据库使用 H2:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.200</version>
</dependency>

并在 IntelliJ 上使用 Maven。

这是一个非常简单的 JPQL/HQL 查询,由于您是 Hibernate 的新手,我建议您先阅读一本书或学习有关该主题的教程,而不是像我认为的那样使用 Whosebug首先通过一些 material 学习最多。在学习 Hibernate 的过程中,您很可能会遇到更多的问题,并且您可以通过先学习基础知识轻松地回答其中的大部分问题。这只是一个友好的提示,可以避免您因为等待答案而感到沮丧,所以请按照您认为合适的方式去做。无论如何,您的用例查询将如下所示:

Doctor d = entityManager.createQuery("select d from PrimaryDoctor p join p.doctor d where p.id = :id", Doctor.class)
    .setParameter("id", primaryDoctorId)
    .getSingleResult();