如何使用 Hibernate 或 JPA 存储库通过自然 ID 列表获取多个实体?

How to fetch multiple entities by a list of natural ids with Hiberate or JPA repository?

如果我有一个自然 ID 列表,我怎样才能一次获取数据库中与这些自然 ID 关联的所有记录?

我所看到的都是让您通过自然 Id 查找实体的方法,下面显示了一个示例。

    @Override
    public Optional<T> findBySimpleNaturalId(ID naturalId) {

        Optional<T> entity = entityManager.unwrap(Session.class)
                .bySimpleNaturalId(this.getDomainClass())
                .loadOptional(naturalId);

        return entity;
    }

我正在寻找一种可以获取自然 ID 列表并获取具有这些自然 ID 的所有实体的方法。我当前的实体有一个自动生成的 UUID 和一个 naturalId,我想保持这种状态。

下面有这样的吗

List<Song> songs = entityManager
.unwrap(Session.class)
.byMultipleSimpleNaturalIds(Song.class)
.multiLoad(songGroup.getSongIds());

// or using the repository
customRepository.findAllByNaturalId(...)

您看到的示例向您展示了如何自己构建它们,因为 spring 没有为您提供单独的方法;除了必须有一个 id 之外,它对您实体中的属性一无所知。如果你想要一个 findAllByNaturalId 方法,你必须在界面中定义它。

在您的 customRepository 中指定:

public List<Song> findByNaturalIdIn(List<Int> naturalIds);

Spring 应该生成一个实现,该实现创建类似于“Select s from Song s where s.naturalId In :naturalIds”的查询。

如果没有,只需添加该 JPQL 查询字符串作为注释,它就会为您执行:

@Query(value = "Select s from Song s where s.naturalId In :naturalIds")
public List<Song> findByNaturalIdIn(List<Int> naturalIds);

或者您可以编写自己的实现方法来执行您的 loadOptional 调用或您希望的任何查询,但您仍然必须在您的存储库中定义该方法。