【问题标题】:Simple HQL/sql query..need assistance?简单的 HQL/sql 查询..需要帮助?
【发布时间】:2011-08-04 06:25:08
【问题描述】:

我有 2 个表(实体)一个人实体和一个假期实体。一个人可以有很多假期。

我想要做的是以下查询:

选择所有人的期间!但是对于有假期的人,我想获取所有有条件的人的假期,以免说startDate介于两者之间。

只是要明确一点,无论假期有什么限制,我仍然希望得到所有的人。这是我当前的 HQL 查询:

select distinct p 
from Person as p 
left join fetch p.vacations as v 
where v.startDate between '2011-07-01' and '2011-07-30'

它的问题是它限制我的人只返回那些尊重条件的假期......有人可以帮忙吗?

如果有人可以用本机 SQL 告诉我,我没有问题

感谢@Quasdunk,在本机 SQL 中解决了更新问题:

SELECT * 
FROM person as p 
LEFT JOIN 
     (SELECT * FROM vacation
      WHERE startDate BETWEEN '2011-08-01' AND '2011-08-30') as v ON v.person_id = p.id

我的新问题是如何将其转换为 HQL 查询,以便我可以获取每个人的假期以及要区分的人(条件保持不变)。

【问题讨论】:

    标签: mysql sql hibernate hql


    【解决方案1】:

    在本机 SQL 中,这将是:

    SELECT * 
    FROM person 
    LEFT JOIN (SELECT * 
               FROM vacations 
               WHERE startDate BETWEEN '2011-07-01' AND '2011-07-30')
    

    未经测试,但你明白了 :)

    【讨论】:

    • @Alexx 究竟是什么不起作用?表名是否正确?假期中的person-foreign-key是否与in person的名称相同(否则您必须加入... on)?
    • 您正在混合人员和假期的列,并返回更多行。比如 select * from person p where person_id in (select person_id from holidays where ...) 或者 person_id not in (select person_id from holidays)
    • @Udo Fholl 这就是我理解这个问题的方式。他想要所有人,如果他们在那段时间正在度假,则应该选择一些假期字段。因此,加入所有有一部分假期的人对我来说似乎很合适。
    • @Quasdunk:我只是以另一种方式理解他。所有没有假期的人。以及所有在一段时间内休假的人。我可能弄错你了。
    • 每个派生表都必须有自己的别名 - 这是我得到的错误..我在 sql 中不太好
    【解决方案2】:

    试试下面的,

    select p.*, v.* from PERSON p LEFT JOIN VACATION v on (p.id = v.p_id) where v.startDate between '2011-07-21' and '2011-07-22'

    希望这对你有用。

    【讨论】:

    • 对不起...但它与我发布的查询相同...只是 sql 不是 hql..thx 帮助虽然
    • 嗨,Alex,我在样本数据上进行了测试。我以为您也可以使用本机 sql。因此,sql中的输出。不知道为什么 HQL 版本显示不同的数据。或许,您可以包含解释计划,或示例数据以及您从 HQL 执行中获得的输出。
    • 对不起,回答迟了,但就像我之前说的那样......它没有做我想让他做的事情......它只返回有假期的人
    【解决方案3】:

    您可能想使用函数来实现它:

    select p from Person p 
    where p.vacations.size = 0 
    or (minelement(p.vacations) > '2011-07-01' 
        and 
        maxelement(p.vacations) < '2011-07-30')
    

    这些日期实际上可能是 Date 类型。取决于类型。

    试试

    select p from Person p 
    where p.vacations.size = 0 
    or (p.vacations.startDate > '2011-07-01' 
        and 
        p.vacations.endDate < '2011-07-30')
    

    你也应该看看here

    【讨论】:

      【解决方案4】:

      在普通的 (My)SQL 中,它看起来像这样:

      select distinct p.* from person p
      left join vacations v on p.id = v.person_id 
      where v.id is null or.v.start_date between '2011-07-01' and '2011-07-30'
      

      在 HQL 中,这可能是(未测试)

      select distinct p from Person as p 
      left join fetch p.vacations as v 
      where v.id is null or  v.startDate between '2011-07-01' and '2011-07-30'
      

      或者也许(我不确定这是否可行)

      select distinct p from Person as p 
      left join fetch p.vacations as v 
      where v is null or v.startDate between '2011-07-01' and '2011-07-30'
      

      【讨论】:

      • 我已经做了类似的事情,但只是部分..因为如果有人有假期,但开始日期不在区间内,它将返回 null ,因为假期方面不为 null并尊重条件。
      猜你喜欢
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多