#java #hibernate #orm #h2
Вопрос:
Новичок в спячке. У меня есть следующая настройка:
@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;
}
Я хочу получить Doctor
объект, запросив primary_doctor
таблицу. Я знаю, что могу присоединиться к 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
досье. Нужно ли мне это иметь?
Моя версия для гибернации:
<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>
И использование Maven на IntelliJ.
Ответ №1:
Это довольно простой запрос JPQL/HQL, и поскольку вы новичок в гибернации, я бы посоветовал вам начать с чтения книги или следовать учебнику по этой теме, вместо того, чтобы переходить к StackOverflow, так как я думаю, что вы узнаете больше всего, сначала проработав некоторый материал. Скорее всего, у вас возникнет еще много вопросов во время обучения Hibernate, и на большинство из них вы легко сможете ответить сами, сначала изучив основы. Это просто дружеский совет, чтобы вы не расстраивались из-за того, что ждете ответов, поэтому делайте все, что считаете нужным. В любом случае, запрос для вашего варианта использования будет выглядеть так:
Doctor d = entityManager.createQuery("select d from PrimaryDoctor p join p.doctor d where p.id = :id", Doctor.class)
.setParameter("id", primaryDoctorId)
.getSingleResult();