从内部联接获取Hibernate实体在同一个实体上

时间:2017-05-19 15:57:18

标签: java postgresql hibernate jpa

我正在尝试获取每个EmergencyJob执行的最后Employee(即具有最大结束时间的那个)。

我有以下实体

EmergencyJob

@Entity
@Table(name = "emergencyjobs", schema = "simulator")
public class EmergencyJob {

    @Id
    private String jobId;
    private LocalDate dateLogged;
    private LocalTime timeLogged;
    private double easting;
    private double northing;
    private String priority;

    private Point location;

    @ManyToOne
    private Engineer assignedEngineer;
    private LocalTime startTime;
    private LocalTime endTime;

    ...
}

工程师

@Entity
@Table(name = "engineer", schema = "simulator")
public class Engineer {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int engineerId;
    private Point homeLocation;

    ...
}

这些表是由Hibernate生成的,我可以使用以下查询在数据库中执行我需要的操作:

SELECT e.*
FROM simulator.emergencyjobs AS e
INNER JOIN (

    SELECT 
    assigned_engineer_engineer_id,
    max(end_time) as end_time
    FROM simulator.emergencyjobs
    GROUP BY assigned_engineer_engineer_id
) AS ee
ON e.assigned_engineer_engineer_id = ee.assigned_engineer_engineer_id
AND e.end_time = ee.end_time

但我无法弄清楚如何使用它来检索Hibernate中EmergencyJob个实体的列表。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

这应该可以解决(获取是可选的):

select ej 
from emergencyJob ej
  inner join fetch ej.assignedEngineer e
where ej.endTime = (select max(distinct sej.endTime) 
                  from emergencyJob sej 
                  where sej.assignedEngineer = e)

还要记住在EmergencyJob实体上定义连接列:

@ManyToOne
@JoinColumn(name = "assigned_engineer_engineer_id")
private Engineer assignedEngineer;