我有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代码中的某些内容,也许可以使用本机查询?
答案 0 :(得分:1)
首先,将您的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。