是否有可能由于HQL而在'FROM'子句中使用子查询来转换SQL查询

时间:2019-02-28 13:49:06

标签: hibernate subquery hql

我有2个表:Machine和MachineAvailability。我想从给定的计算机上检索可用性。即使没有符合我的条件的可用性,我仍然想检索我的机器。所以我写了这个本地SQL查询:

select *
from (
       select ma.*
       from machine m1
       join machine_availability ma on m1.id = ma.id_machine
       where m1.id = 43
         and ma.available is true
         and ma.id_day > '20190228'
     ) as m
       right join machine m2 on m2.id = m.id_machine
where m2.id = 43;

问题是我有义务使其成为HQL查询,因为我的Machine和MachineAvailability之间的@OneToMany关联是LAZY。但是我在文档中读到HQL不支持'FROM'子句中的子查询。

任何人都知道如何将其转换为HQL?

或者如果我更改Java代码中的某些内容,也许可以使用本机查询?

1 个答案:

答案 0 :(得分:1)

首先简化您的SQL

首先,将您的SQL简化为此(两次访问machine毫无意义):

select *
from machine m
left join machine_availability ma 
  on m.id = ma.id_machine
  and ma.available is true
  and ma.id_day > '20190228'
where m.id = 43;

现在,将其转换为HQL应该很简单,或者只执行本机查询即可。

关于将字符串用作日期的注释

如果可以的话,我强烈建议不要在日期中使用人类可读的字符串。这只会导致您的谓词在优化器的基数估计中造成重大混乱,从而在索引合适时进行全表扫描,反之亦然。 I've blogged about this here