grails HQL with子句

时间:2015-09-09 08:58:42

标签: grails hql

由于我之前的问题没有得到答复,我想再问一个部分。

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;条款。这可能是这种或那种方式吗?建议?

1 个答案:

答案 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语法的工作,在上一个例子中似乎有效。

我希望在这个答案的评论中进一步澄清低沉的评论。