[英]How do I write this JPQL query with subquery?
我正在尝试翻译该SQL语句
SELECT
operationalobjective.idoperationalobjective,
pno_oo.name
FROM
public.operationalobjective,
public.policynamedobject pno_oo
WHERE
pno_oo.idpolicynamedobject = operationalobjective.idoperationalobjective AND
operationalobjective.idoperationalobjective NOT IN
(
SELECT
operationalobjective.idoperationalobjective
FROM
public.operationalobjective,
public.goal,
public.policy,
public.policynamedobject pno_oo,
public.policynamedobject pno_p
WHERE
goal.idpolicy = policy.idpolicy AND
goal.idoperationalobjective = operationalobjective.idoperationalobjective AND
pno_oo.idpolicynamedobject = operationalobjective.idoperationalobjective AND
pno_p.idpolicynamedobject = policy.idpolicy AND
policy.idpolicy = <number>
);
考虑到Policy和OperationalObjective都扩展了PolicyNamedObject,我试图将其引入JPQL:
SELECT oo FROM OperationalObjective oo
WHERE oo.idoperationalobjective NOT IN
(
SELECT oo.idoperationalobjective
FROM OperationalObjective oo, Goal g, Policy p
WHERE g.policy = :policy AND g.operationalobjective = oo AND p = :policy
)
但是,当我通过JPA执行该查询时,它会引发一个异常:
ERROR: missing FROM-clause entry for table <<t5>>
SELECT t7.idpolicynamedobject, t7.type, t7.description, t7.name, t0.idoperationalobjective, t0.idobjectivescategory
FROM public.OperationalObjective t0 INNER JOIN public.PolicyNamedObject t7 ON t0.idoperationalobjective = t7.idpolicynamedobject
WHERE (NOT (t0.idoperationalobjective IN
(
SELECT t5.idoperationalobjective
FROM public.OperationalObjective t1 CROSS JOIN public.Goal t2 CROSS JOIN public.policy t3
INNER JOIN public.PolicyNamedObject t4 ON t3.idpolicy = t4.idpolicynamedobject
INNER JOIN public.PolicyNamedObject t6 ON t5.idoperationalobjective = t6.idpolicynamedobject, public.OperationalObjective t5
WHERE (t2.idpolicy = ? AND t2.idoperationalobjective = t5.idoperationalobjective
AND t3.idpolicy = ?) AND t6.type = ?))) AND t7.type = ?} [code=0, state=42P01]
我已经使用PgAdmin执行了SQL语句,它检索了我想要的内容,但是我不知道我在做错什么,将其转换为JPQL ...知道吗?
先感谢您 :)
我怀疑您将需要重构JPQL语句以使用子查询“ EXISTS”,因为IN语句不支持子选择。 希望这将为您指明正确的方向。
SELECT oo FROM OperationalObjective oo
WHERE NOT EXISTS
(
SELECT oosub
FROM OperationalObjective oosub
JOIN oosub.goal g
JOIN g.policy p
WHERE <<where conditions>>
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.