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
Native SQL
left join contract cnt
on agr.wgv_id = cnt.wgv_id
and agr.date >= cnt.validFrom
and agr.date < cnt.validTill
在上一个问题中,建议是使用HQL和&#39;&#39;条款。这可能是这种或那种方式吗?建议?
答案 0 :(得分:0)
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并且需要额外的那些)但可能有用:
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&gt; = cnt.validFrom和agr.date&lt; cnt.valifTill to agr.date&gt; =:start and agr.date&lt; :端
这有用吗?
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)
2015年9月16日更新
几天前,这让我思考并尝试了一些新方法让它发挥作用。它基于一个完全不同的数据集,我不再拥有它,但这里是我发现的:< / p>
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的例外。这让我觉得虽然它在循环中有些如何不能保持现有的关系......(可能是休眠中的一个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语法的工作,在上一个例子中似乎有效。
我希望在这个答案的评论中进一步澄清低沉的评论。