我正在尝试学习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
之间而不是{{ 1}}。
我无法将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
或者有没有副作用更少的更好的解决方案,例如表更新,加载等的顺序?