如何执行 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;
}
使用原生查询这应该可以在没有辅助方法的情况下实现。
我有一个 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;
}
使用原生查询这应该可以在没有辅助方法的情况下实现。