我正在尝试学习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_IDEMPLOYEES.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_IDEMPLOYEES.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 = ?

或者是否有更好的解决方案,副作用更少,例如表的更新顺序,加载等?