首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >grails HQL with子句

grails HQL with子句
EN

Stack Overflow用户
提问于 2015-09-09 08:58:41
回答 2查看 124关注 0票数 0

由于我先前的问题没有答案,所以我想再问一次。

HQL

代码语言:javascript
复制
    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

我收到消息了

代码语言:javascript
复制
with-clause referenced two different from-clause elements

原生SQL

代码语言:javascript
复制
left join contract cnt
    on agr.wgv_id = cnt.wgv_id
       and agr.date >= cnt.validFrom
       and agr.date < cnt.validTill

在上一个问题中,建议是使用HQL和with子句。这有可能是这样还是那样?有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-10 09:42:53

{替换}

如果希望捕获空记录,则只需要左联接,否则只需使用联接即可。

代码语言:javascript
复制
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)

想要

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2015-09-09 13:36:07

代码语言:javascript
复制
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),但可能有用:

代码语言:javascript
复制
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返回任何东西,这可能更有意义。

代码语言:javascript
复制
    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

这个有用吗?

代码语言:javascript
复制
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日

几天前,这件事让我想了想,并尝试了一些新的方法来使它运转。它基于一个完全不同的数据集,我已经没有了,但是我发现:

代码语言:javascript
复制
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 )

所以我最后做了:

代码语言:javascript
复制
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语法工作的,在上一个例子中,这似乎是有效的。

我希望这能澄清在这个答案的评论中模糊的评论。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32475219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档