java - 如何在 JPA 中注释这个复杂的连接?

标签 java jpa join annotations

假设我有下表:

Locations
================
LocationKey,    LocationName


Employees
================
EmployeeKey,    FirstName,    LastName


EmployeeLocationXRef
================
EmployeeLocationXRefKey,    LocationKey,    EmployeeKey


TimeSheets
=================
TimeSheetKey,    EmployeeLocationXRefKey,    Minutes

好的,如您所见,为了让我获得 LocationEmployee 的所有 TimeSheets,我可以在 SQL 中执行以下操作

select
    *
from TimeSheets ts
    join EmployeeLocationXRef ex on (ex.EmployeeLocationXRefKey = ts.EmployeeLocationXRefKey)
    join Locations l on (l.LocationKey = ex.LocationKey)
    join Employees e on (e.EmployeeKey = ex.EmployeeKey)
where
    l.LocationKey = 'xxxx'
    and e.EmployeeKey = 'yyyy'

但我已经尝试了我能想到的所有方法,使用 @JoinTable 等在 JPA 中映射(带注释)。

有什么想法可以做到这一点吗?不幸的是,这是一个遗留系统,架构无法更改。

编辑

忘记提及 EmployeeLocationXRef 实体尚未直接映射。这可能是真正的问题。我将了解如何创建该实体映射,并看看它是否会使它变得更容易。

最佳答案

我没有发现这个模式有什么特别困难或奇怪的地方。每个表应该只有一个实体(除非有唯一的约束):

  • 使用 JoinColumn 实现 EmployeeLocationXRef 和 Location 之间的 ManyToOne
  • EmployeeLocationXRef 和 Employee 之间的 ManyToOne(使用 JoinColumn)
  • Timesheet 和 EmployeeLocationXRef 之间的 ManyToOne,使用 JoinColumn

(这些关联当然可以是双向的,或者如果您愿意的话可以是另一个方向)。

JPQL 查询很简单

select ts from Timesheet ts
    join ts.employeeXRef ex
    join ex.location l
    join ex.employee e
where
    l.locationKey = 'xxxx'
    and e.employeeKey = 'yyyy'

这是 SQL 查询的简单翻译。

关于java - 如何在 JPA 中注释这个复杂的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19716263/

相关文章:

search - Hbase按部分键搜索?

php - WordPress 插件内连接表

java - JUnit - 如何测试具有不同值的方法?

java - tomcat中的资源管理

java - 自定义 JOptionPane 消息对话框按钮时出错

java - JPQL/SQL 获取最新的按列分组的记录

python - pandas 合并中聚合映射值

java - 循环遍历方向

java - JPA + 如何使用第三个表作为一对多关系中的联接来选择记录?

java - JPA 关系的显式删除