Я пытаюсь выучить 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 *