grails HQL with子句
由于我先前的问题没有得到回答,我想再问一部分 HQL 本机SQLgrails HQL with子句,grails,hql,Grails,Hql,由于我先前的问题没有得到回答,我想再问一部分 HQL 本机SQL left join contract cnt on agr.wgv_id = cnt.wgv_id and agr.date >= cnt.validFrom and agr.date < cnt.validTill 在上一个问题中,建议使用HQL和“with”子句。这可能是一种方式还是另一种方式?建议 from Agenda agr inner join agr.age
left join contract cnt
on agr.wgv_id = cnt.wgv_id
and agr.date >= cnt.validFrom
and agr.date < cnt.validTill
在上一个问题中,建议使用HQL和“with”子句。这可能是一种方式还是另一种方式?建议
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)
如果希望捕获空记录,则只需要左连接,否则只需使用连接即可
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)
如评论所述:
雇主有许多合同,但根据给定日期,其中只有一份有效
在这种情况下,您可以使用exists子句选择一行来匹配标准,不确定以下内容是否完全正确,即是否需要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.datefrom 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的例外。这让我想到,虽然这是一个循环,但它如何无法保持现有的关系。。可能是冬眠中的一只虫子
所以我最终做了:
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,它只在一个dateField中,而在另一个dateField中不存在,并且它似乎不再起作用。
我的测试并没有试图收回任何数据,它更多的是关于hql语法的工作,在上一个示例中,hql语法似乎工作正常
我希望这能清除这个答案评论中的模糊评论。{p>{replacement}
如果希望捕获空记录,则只需要左连接,否则只需使用连接即可
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
事实上,我需要空记录,这正是重点。可能的解决方案是什么,where子句在这种情况下不可用。有没有雇主的议程记录,这些必须包括在内,有额外或空值的解决办法不是我想要的。上一篇文章建议HQL包含WITH子句是解决方案,但我无法让它工作。尝试将该段更改为a.employeer.id为null或a.employeer.id=:employeeIdAs说,关键是我不需要where子句解决方案,而是尽可能使用JOIN WITH构造。在de date字段上有映射id和额外and的情况下,与的联接似乎不起作用。雇主有许多合同,但根据给定日期,其中只有一份有效。雇员是另一种关系吗?如果是这样的话,试试内部join agr.agenda a join a.employee e with e.id=:employeeIdI已经这样做了,是的,有员工和雇主。查看通缉代码。具有的联接是否仅适用于参数?
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