使用 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();
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();