如何使用 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 调用或您希望的任何查询,但您仍然必须在您的存储库中定义该方法。
如果我有一个自然 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 调用或您希望的任何查询,但您仍然必须在您的存储库中定义该方法。