【发布时间】:2019-07-13 04:50:48
【问题描述】:
我得到了以下 SQL,我想将其转换为有效的 HQL。这个问题是,它不允许加入每个docs 的子查询。即使这些是旧文档 (v3.3),这部分似乎仍然适用于 hibernate 5.3。
SELECT f.date,
f.name,
SUM(f.seats)
FROM Foo f
INNER JOIN (SELECT fl.date,
fl.start + fl.end AS code
FROM Foo fl
WHERE fl.date >= (SELECT MAX(earliestDate)
FROM Bar)
AND fl.name = :name) fl
ON f.start + f.end = code
AND f.date = fl.date
WHERE f.date >= ( SELECT MAX(earliestDate)
FROM Bar)
GROUP BY f.date,
f.name
ORDER BY f.date ASC,
SUM(f.seats) DESC
我想出了这个 HQL:
SELECT NEW com.company.project.model.FooRepresentation( f.fooId.date,
f.fooId.name,
SUM(f.seats))
FROM Foo f
INNER JOIN (SELECT fl.fooId.date,
fl.fooId.start + fl.fooId.end AS code
FROM Foo fl
WHERE fl.fooId.date >= (SELECT MAX(earliestDate)
FROM FooConfig)
AND fl.fooId.name = :name) fl
ON f.fooId.start + f.fooId.end = code
AND f.fooId.date = fl.fooId.date
WHERE f.fooId.date >= ( SELECT MAX(earliestDate)
FROM FooConfig)
GROUP BY f.fooId.date,
f.fooId.name
ORDER BY f.fooId.date ASC,
SUM(f.seats) DESC
尝试执行此 HQL 查询,导致此异常
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: ( near line 1, column 169
暗示(INNER JOIN (SELECT。
有没有办法加入 HQL 中的子查询?如果没有,用 HQL 实现与 SQL 相同结果的最佳方法是什么?
我不太擅长将 inner join on <sub-query> 转换为允许子查询的实际 where 子句
【问题讨论】:
-
您为什么要这样做而不是坚持使用 SQL 的原因是什么?
-
主要是为了方便将结果转换为非
@Entity类 (NEW com.company.project.model.FooRepresentation()) -
哦,
NEW com.company.project.model.FooRepresentation语法?但我的意思是,与重写所有代码相比,这是从Object[]映射到构造函数调用的一行代码:) 无论如何 - 我不确定这将是一个简单的重写...... -
如果没有不允许加入子查询的不便,这实际上并不难转换。它基本上只是替换列名。所以你会建议我使用原生查询并自己映射它?