java - 在 JPA 中将多个表映射到单个实体
问题描述
我正在尝试学习 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
and之间EMPLOYEES.EMPLOYEE_ID
,而不是DEPARTMENTS.MANAGER_ID = EMPLOYEES.MANAGER_ID
.
我不能替换referencedColumnName="employeeId"
为referencedColumnName="managerId"
managerId of @Entity EmployeesDepartment
is not a primary key of 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 = ?
或者有没有副作用更少的更好的解决方案,例如表的更新顺序、加载等?
解决方案
推荐阅读
- node.js - 使用 oAuth2 时缺少 google sheet api 密钥
- docker - devcontainer,如何使 X 显示工作(在 Visual Studio 代码中的 docker 内安装图形)
- android-navigation - 使用视图绑定导航
- python - Python:删除重复的字符串并保持在某些参数内
- python - 如何从篮球参考资料中获取阵容?
- python - 带有整数的模板的 Cython 绑定
- java - 广播接收器,¿我做得对吗?
- java - 即使我完成了活动,firebase 连接是否仍然处于活动状态?
- node.js - Nodejs cors 允许某些路由的所有来源
- python - 如何在 CNN 中获得更高的验证准确度?