由于 HQL,是否可以使用 'FROM' 子句中的子查询转换 SQL 查询
is it possible to transform a SQL query with a subquery in 'FROM' clause because of 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 代码中更改某些内容,也许我可以使用我的本机查询?
先简化您的 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 应该很简单,或者只需执行本机查询。
关于使用字符串作为日期的附注
如果可以,我强烈建议不要为日期使用人类可读的字符串。它只会导致优化器对您的谓词的基数估计产生重大混淆,导致在索引为 suitable 时进行完整的 table 扫描,反之亦然。 I've blogged about this here.
我有 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 代码中更改某些内容,也许我可以使用我的本机查询?
先简化您的 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 应该很简单,或者只需执行本机查询。
关于使用字符串作为日期的附注
如果可以,我强烈建议不要为日期使用人类可读的字符串。它只会导致优化器对您的谓词的基数估计产生重大混淆,导致在索引为 suitable 时进行完整的 table 扫描,反之亦然。 I've blogged about this here.