Отображение нескольких таблиц в один объект в JPA - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь выучить JPA / Hibernate, и я очень зеленый в этой области.Я склонен отклоняться и пробовать что-то, не зная об API.Поэтому я решил создать простой объект, который извлекает информацию из нескольких таблиц, и это легко реализуется с помощью JPA.Причина этого заключается в том, что, если гипотетически, каждая из участвующих таблиц имеет несколько сотен столбцов, и у нас есть только бизнес-необходимость извлечь очень мало данных, и нам нужно сосредоточиться только на извлечении, а не на вставках / обновлениях / удалениях, яПредполагается, что лучше всего извлечь всю сущность (особенно, если необходимо вернуть несколько строк), а затем соединить их с другими сущностями, чтобы получить несколько столбцов.

Я начал с двух простых таблиц:

EMPLOYEES
EMPLOYEE_ID, EMAIL, DEPARTMENT_ID, MANAGER_ID, FIRST_NAME, etc...

DEPARTMENTS
DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, etc...

Я хочу, чтобы моя сущность извлекала только следующие столбцы, основанные исключительно на EMPLOYEES.EMPLOYEE_ID:

EMPLOYEES.EMPLOYEE_ID
EMPLOYEES.MANAGER_ID
EMPLOYEES.DEPARTMENT_ID
DEPARTMENT.DEPARTMENT_NAME

Здесь следует отметить, что EMPLOYEES.MANAGER_ID является внешним ссылочным внешним ключом дляEMPLOYEES.EMPLOYEE_ID.

Я мог бы создать следующее ...

@SecondaryTable(name="DEPARTMENTS",
    pkJoinColumns=@PrimaryKeyJoinColumn(name="managerId",referencedColumnName="employeeId")
)
@Table(name="EMPLOYEES")
@Entity
public class EmployeesDepartment {

    @Id
    private String employeeId;

    private String managerId;

    private String email;

    private int departmentId;

    @Column(name="DEPARTMENT_NAME",table="DEPARTMENTS")
    private String departmentDesc;

// Setters and getters
}

Очевидно, что это не дает нам правильный ответ из-за того, что соединение между вторичной таблицей (DEPARTMENTS) происходит между MANAGER_ID и EMPLOYEES.EMPLOYEE_ID, а не DEPARTMENTS.MANAGER_ID = EMPLOYEES.MANAGER_ID.

Я не могу заменить referencedColumnName="employeeId" на referencedColumnName="managerId", так как managerId @Entity EmployeesDepartment не является первичным ключом EMPLOYEES.

И я не могу сделать следующее:

@OneToOne
@JoinColumn(name="managerId",table="DEPARTMENTS",referencedColumnName="employeeId")
private String managerId;

Мой вопрос заключается в том, как сделать так, чтобы мое объединение было на DEPARTMENTS.MANAGER_ID = EMPLOYEES.MANAGER_ID, в то время как предложение WHEREзапрос основан на EMPLOYEES.EMPLOYEE.ID?Другими словами, как я могу получить сущность, сопоставленную со следующим запросом:

SELECT
  E.EMPLOYEE_ID,
  E.MANAGER_ID,
  E.DEPARTMENT_ID,
  D.DEPARTMENT_NAME
FROM EMPLOYEES E LEFT OUTER JOIN DEPARTMENTS D ON E.MANAGER_ID = D.MANAGER_ID
WHERE E.EMPLOYEE_ID = ?

Или есть лучшее решение с меньшим количеством побочных эффектов, например, порядок обновления таблиц, загрузка и т. Д.?1038 *

...