由于我先前的问题没有答案,所以我想再问一次。
HQL
from Agenda agr
inner join agr.agenda a with a.employee.id = :employeeId
left join agr.employer wgr
left join wgr.contracts cnt with agr.date >= cnt.validFrom and agr.date < cnt.ValidUntil我收到消息了
with-clause referenced two different from-clause elements原生SQL
left join contract cnt
on agr.wgv_id = cnt.wgv_id
and agr.date >= cnt.validFrom
and agr.date < cnt.validTill在上一个问题中,建议是使用HQL和with子句。这有可能是这样还是那样?有什么建议吗?
发布于 2015-09-10 09:42:53
{替换}
如果希望捕获空记录,则只需要左联接,否则只需使用联接即可。
from Agenda agr
inner join agr.agenda a with a.employee.id = :employeeId
left join agr.employer wgr
left join wgr.contracts cnt
where agr.date >= :start
and agr.date <= :end
and ((agr.date >= cnt.validFrom and agr.date < cnt.validTill) or agr.employer is Null)想要
from Agenda agr
inner join agr.agenda a with a.employee.id = :employeeId
left join agr.employer wgr
left join wgr.contracts cnt with agr.date >=cnt.validFrom and agr.date < cnt.valifTill
where agr.date >= :start
and agr.date <= :end发布于 2015-09-09 13:36:07
from Agenda agr
inner join agr.agenda a
left join agr.employer wgr
left join wgr.contracts cnt
where (a.employee.id = :employeeId) and (agr.date >= cnt.validFrom and agr.datm < cnt.validTill)如果希望捕获空记录,则只需要左联接,否则只需使用联接即可。
如评论所述:
雇主有许多合同,但其中只有一份在某一特定日期有效。
在这种情况下,您可以执行一个exists子句来选择1行以匹配标准,不确定以下内容是否完全正确(也就是说,如果上面需要cnt,并且需要额外的cnt),但可能有用:
from Agenda agr
inner join agr.agenda a
left join agr.employer wgr
left join wgr.contracts cnt
where (a.employee.id = :employeeId) and
exists (select 1 from Contracts cnt1 where cnt1.id = cnt.id and agr.date < cnt1.valifTill and agr.date >=cnt1.validFrom)如果您不需要从cnt返回任何东西,这可能更有意义。
from Agenda agr
inner join agr.agenda a
left join agr.employer wgr
where (a.employee.id = :employeeId) and
exists (select 1 from Contracts cnt1 where agr.date < cnt1.valifTill and agr.date >=cnt1.validFrom)另一个测试:
尝试将agr比较值更改为当前传入的实际参数的测试,因此将agr.date >=cnt.validFrom和agr.date < cnt.valifTill更改为agr.date >= :start和agr.date < :end
这个有用吗?
from Agenda agr
inner join agr.agenda a with a.employee.id = :employeeId
left join agr.employer wgr
left join wgr.contracts cnt with (agr.date >= :start and agr.date < :end)
where (agr.date >= :start
and agr.date <= :end)更新3 2015年9月16日
几天前,这件事让我想了想,并尝试了一些新的方法来使它运转。它基于一个完全不同的数据集,我已经没有了,但是我发现:
select new map (agr as agr, agr.date as lst)
from Agenda agr
inner join agr.agenda a with a.employee.id = :employeeId
left join agr.employer wgr
left join wgr.contracts cnt with (lst >=cnt.validFrom and lst < cnt.valifTill)
where (agr.date >= :start
and agr.date <= :end)我认为这是一个关于不承认lst的例外。这让我想,虽然它的内部循环,有些是如何无法保持现有的关系.(可能是hibernate中的一个bug )
所以我最后做了:
select new map (agr as agr)
from Agenda agr
inner join agr.agenda a with a.employee.id = :employeeId
left join agr.employer wgr
left join wgr.contracts cnt with (agr >=cnt.validFrom and agr < cnt.validTill)
where (agr.date >= :start
and agr.date <= :end)这个奇怪的工作方式,但请注意,agr,即议程,也包含相同的日期字段,ValidFrom和ValidTill。我确实尝试了另一个dateField,它只在一个中,而不是在另一个中,它似乎不再起作用了。我的测试没有试图撤回任何数据--更多的是关于hql语法工作的,在上一个例子中,这似乎是有效的。
我希望这能澄清在这个答案的评论中模糊的评论。
https://stackoverflow.com/questions/32475219
复制相似问题