grails HQL with子句

grails 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

由于我先前的问题没有得到回答,我想再问一部分

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.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.date=:开始和agr.date<:结束

这行吗

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的例外。这让我想到,虽然这是一个循环,但它如何无法保持现有的关系。。可能是冬眠中的一只虫子

所以我最终做了:

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