现有两个持久化的类 :
员工Employee (id ,name,department, ...)
合同Contact(id,employee,startTime,endTime,...)。
一个员工可对应多个合同, 现要进行连接查询 达到 员工与合同成为一对一。
规则: 每个员工只取最新的合同:即startTime 是最大的。
已经有一个思路:
"from bropen.erp.hr.employee.Contract where employee=? and active=1 order by dateStart desc“
可是员工和合同还有很多字段我需要把他们进行联合查询组成一个Map 进行后续运算。
我的需求就是要做一个 员工合同中任意字段组合的条件查询: 比如部门A,且16年签订合同的员工 。。。等等
我知道的思路:
select new map(e.code as code,e.id as empId,e.name as employeeName,e.company.name as company,
e.department.name as department,c.position as position) from Employee e left outer join e.contracts c
where (c.id in (select max(id) from Contract where employee.id = e.id and c.active=1 group by employee.id) or c.id is null)
(// 有多个合同时,选择id最大的一个,因为是最后存入的)
这个虽然行的通,但是这种曲线救国的方式还是不符合实际业务,现在需要达成 :一对一的连接条件是该员工开始时间最大的合同。