我正在尝试学习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="managerId"
替换 referencedColumnName="employeeId"
,因为 @Entity EmployeesDepartment
的managerId不是 EMPLOYEES
的主键 .
我不能做以下事情:
@OneToOne
@JoinColumn(name="managerId",table="DEPARTMENTS",referencedColumnName="employeeId")
private String managerId;
我的问题是,如果查询的 WHERE
子句基于 EMPLOYEES.EMPLOYEE.ID
,我如何使我的联接在 DEPARTMENTS.MANAGER_ID = EMPLOYEES.MANAGER_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 = ?
或者是否有更好的解决方案,副作用更少,例如表的更新顺序,加载等?