我有一个ID列表,我需要一个查询来只返回那些在指定表中不存在的ID。我知道,在SQL中,可以这样做:
select *
from (
values (4),(5),(6)
) as v(id)
where not exists (select *
from images i
where i.id = v.id);
(From这个答案是:(第10页)
但是我尝试使用JPA@Query
,并将列表作为参数传递,这似乎并不合适。
SELECT t.id
FROM :ids AS t(id)
WHERE NOT EXISTS
([Nested select clause])
与
List<Long> findIdsMissingFromTable(@Param("ids") List<Long> ids, [...]
我也试过(VALUES :ids)
,它也不喜欢,并删除了AS
,得到了同样的结果。在所有情况下,我得到的QuerySyntaxException: unexpected token: ( near line 1, column 18 [...]
在第一种情况下似乎是冒号,在第二种情况下似乎是左括号。
我应该做什么呢?
2条答案
按热度按时间ds97pgxw1#
JPA查询不允许WHERE或HAVING子句之外的子查询。在本例中的子查询是
(VALUES :ids)
,因为它生成了一个表,查询的其余部分可以使用。如果可以重新组织它,使子查询位于WHERE子句中,问题就可以通过这种方式解决。但是,对于我的情况,设置nativeQuery = true
是最简单的解决方案,因为我不需要任何特定于JPA的特性,如FETCH。cmssoen22#
我尝试使用原生查询和值(:ids)进行传递。它只选取了一个id,而不是列表中所有传递的id。您是否执行了其他步骤来创建查询