如何将此 SQL 查询转换为 Hibernate 的 HQL?
How to translate this SQL query into Hibernate's HQL?
以前使用过 Hibernate 但从未达到这种程度,我在尝试将以下查询转换为有效的 Hibernate SQL 查询时遇到了困难。
SELECT * FROM
(SELECT * FROM scripts WHERE (script.type LIKE 'DATA'))
AS A JOIN
(SELECT * FROM req_executions
WHERE (req_executions.fk_database NOT IN
(SELECT executions.fk_database FROM executions
WHERE executions.fk_script = req_executions.fk_script))
OR ((req_executions.fk_database = 12 AND req_executions.fk_database != 8)
AND req_execution.fk_database NOT IN (SELECT executions.fk_database FROM execution
WHERE executions.fk_script = req_executions.fk_script)))
AS B
ON (A.id = B.fk_script)
此查询的结果是经过过滤的 table 等待执行的脚本。
我试过类似的东西:
"SELECT req FROM (SELECT s FROM Script s
WHERE( s.filename LIKE :filename AND s.type = :scriptType AND s.ticketNumber LIKE :ticketNumber )
JOIN (SELECT re FROM RequiredExecution re
WHERE (re.key.databaseId NOT IN (SELECT e.database FROM Execution e WHERE e.script.id = re.key.scriptId))
OR ((re.key.databaseId = :forAllId AND :dbId != :syncId)
AND re.key.databaseId NOT IN
(SELECT e.database FROM Execution e WHERE e.script.id = re.key.scriptId)))) WHERE (s.id = re.key.scriptId)"
并使用 "AS"
但我离解决方案还很远。有什么建议吗?
我以为你必须 select 来自一个实体而不是另一个 SELECT ...我不知道这是否可能,反正看起来很难。
您可以考虑坚持使用本机 SQL 查询调用 session.createSQLQuery("the native SQL")
。
和 .addEntity(YourEntityClass.class)
自动映射结果
和 .setParameter(
,基于 0 的编号,而查询使用 ?
占位符而不是 :named_parameter.
最后我被迫改用 nativeQuery,因为“...HQL 子查询只能出现在 select 或 where 子句中。”如 14.13. Subqueries.
中所述
以前使用过 Hibernate 但从未达到这种程度,我在尝试将以下查询转换为有效的 Hibernate SQL 查询时遇到了困难。
SELECT * FROM
(SELECT * FROM scripts WHERE (script.type LIKE 'DATA'))
AS A JOIN
(SELECT * FROM req_executions
WHERE (req_executions.fk_database NOT IN
(SELECT executions.fk_database FROM executions
WHERE executions.fk_script = req_executions.fk_script))
OR ((req_executions.fk_database = 12 AND req_executions.fk_database != 8)
AND req_execution.fk_database NOT IN (SELECT executions.fk_database FROM execution
WHERE executions.fk_script = req_executions.fk_script)))
AS B
ON (A.id = B.fk_script)
此查询的结果是经过过滤的 table 等待执行的脚本。 我试过类似的东西:
"SELECT req FROM (SELECT s FROM Script s
WHERE( s.filename LIKE :filename AND s.type = :scriptType AND s.ticketNumber LIKE :ticketNumber )
JOIN (SELECT re FROM RequiredExecution re
WHERE (re.key.databaseId NOT IN (SELECT e.database FROM Execution e WHERE e.script.id = re.key.scriptId))
OR ((re.key.databaseId = :forAllId AND :dbId != :syncId)
AND re.key.databaseId NOT IN
(SELECT e.database FROM Execution e WHERE e.script.id = re.key.scriptId)))) WHERE (s.id = re.key.scriptId)"
并使用 "AS" 但我离解决方案还很远。有什么建议吗?
我以为你必须 select 来自一个实体而不是另一个 SELECT ...我不知道这是否可能,反正看起来很难。
您可以考虑坚持使用本机 SQL 查询调用 session.createSQLQuery("the native SQL")
。
和 .addEntity(YourEntityClass.class)
自动映射结果
和 .setParameter(
,基于 0 的编号,而查询使用 ?
占位符而不是 :named_parameter.
最后我被迫改用 nativeQuery,因为“...HQL 子查询只能出现在 select 或 where 子句中。”如 14.13. Subqueries.
中所述