Spring JPA 存储库查找所有不存在的内容

标签 spring spring-boot spring-data-jpa

我有一个仓库

public interface PersonRepository extends JpaRepository<Person, Long> {}

实体看起来像这样:

@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    @Id
    private Long id;
    @NotBlank
    private String name;
}

我想要一个方法来检查是否所有“人”都存在于数据库表中,这是我目前所拥有的:

void checkIfAllPersonsExist(List<Long> personIds) {
    var persons = personRepository.findAllById(personIds);
    if (personIds.size() != persons.size()) {
        personIds.removeAll(persons.stream().map(Persons::getId).collect(toList()));
        throw new NotFoundException("Persons with id's [id:%s] does not exist", personIds);
    }
}

不知道Spring JPA Repository能不能提供更优雅的东西?就像返回不存在的 id 的特定命名查询一样?

最佳答案

如果你只想知道有一些id不存在你可以计算它们

@Query("select COUNT(p.id) from Person p where p.id in :ids")
Long countIds(List<Long> ids);

或等效的 based on

long countByIdIn(Collection<Long> ids);

或者返回存在的id列表

@Query("select p.id from Person p where p.id in :ids")
List<Long> getExistenIds(List<Long> ids);

然后筛选出你需要的。

personIds.removeAll(personRepository.getExistenIds(personIds));
if (!personIds.isEmpty()) {
    throw new NotFoundException("Persons with id's [id:%s] does not exist", personIds);
}

关于Spring JPA 存储库查找所有不存在的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58989498/

相关文章:

java - 无法使用 Spring Boot 自动配置访问 REST Controller

java - 如何在不使用配置文件的情况下覆盖 Spring Boot 应用程序属性以进行测试?

spring - 如何使用@DataJpaTest 测试我的自定义 JPA 查询?

java - 是否可以将Map的值分为两种类型?

spring - 如何制作无状态的 Web 应用程序?特别是对于 Spring MVC?

java - Spring 安全、OAUTH Cors、选项

java - 当 Spring/Hibernate JPARepository 返回时,实体处于什么生命周期状态?

java - 我可以同时拥有 Spring Tool Suite 和 Eclipse 吗?

java - 具有多个配置文件的@AutoWired MongoTemplate

java - 避免 Spring ApplicationContext 实例化