Hibernate 由于HQL,是否可以在“FROM”子句中使用子查询转换SQL查询
我有两张桌子:机器和机器可用性。我想从给定的机器检索可用性。即使没有与我的标准匹配的可用性,我仍然希望检索我的机器。因此,我编写了本机SQL查询:Hibernate 由于HQL,是否可以在“FROM”子句中使用子查询转换SQL查询,hibernate,subquery,hql,Hibernate,Subquery,Hql,我有两张桌子:机器和机器可用性。我想从给定的机器检索可用性。即使没有与我的标准匹配的可用性,我仍然希望检索我的机器。因此,我编写了本机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
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查询,因为我的@OneToMany机器和机器可用性之间的关联是懒惰的。但我在文档中读到HQL不支持“FROM”子句中的子查询
有人知道我如何将其转换为HQL吗
或者,如果我更改java代码中的某些内容,也许可以使用本机查询?首先简化SQL
首先,将SQL简化为两次访问计算机没有意义:
挑选*
来自机器m
左连接机器\u可用性ma
在m.id=ma.id\u机器上
这是真的
和ma.id_day>“20190228”
其中m.id=43;
现在,转换为HQL或者只执行一个本机查询应该很简单
关于使用字符串作为日期的旁注
如果可以,我强烈建议不要在日期中使用人类可读的字符串。这只会导致优化器对谓词的基数估计出现重大混乱,导致索引合适时进行全表扫描,反之亦然 首先,感谢您的旁注,但正如我所说的,我想检索一台机器,即使没有与我的标准匹配的可用性,这就是我访问机器的原因twice@sweetacaro:这正是我的查询所做的。观察左连接,条件在连接谓词中,而不是where谓词w,我才意识到其中的微妙之处!太多了!