Считывание во вложенный объект из SQL-запроса с помощью Hibernate 5.4

#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();