如何执行 JPQL 过滤不满足查询的 collection?

How to do a JPQL that would filter a collection that does not satisfy a query?

我有一个 collection idsToCheck 我想做类似的事情

select a.entry from idsToCheck as a where a.entry not in (select d.id from data d)

我现在所做的是

@Query("select count(a) > 0 from Data a where a.id = :id")
boolean isIdExists(String id);


idsToCheck 
  .stream()
  .filter(check-> !artifacts.isIdExists(check))
  .forEach(responseBuilder::addDeletedIds);

仅使用 JPQL 可能可行,但由于 JPQL 不支持 SET 操作并且选择是针对 entities 执行的(因此不针对作为参数给出的标量或数组)它可能是一项复杂的任务。

我意识到我的建议不是纯粹的 JPQL,但它是让查询更抽象的替代方案。我在我的建议中假设 Spring 存储库接口,但我猜它是——稍作修改——也适用于其他地方。

// First fetch all entities in given collection of ids
@Query("SELECT d.id FROM Data d WHERE id in :idsToCheck")
Set<String> findByIds(@Param("idsToCheck") Collection<String> idsToCheck);

// find out which ids were not found at all (the needed SET operation)
default Set<String> findNonExistentIds(Set<String> idsToCheck) {
    idsToCheck.removeAll(findByIds(idsToCheck));
    return idsToCheck;
}

使用原生查询这应该可以在没有辅助方法的情况下实现。