gpt4 book ai didi

java - 如何将泛型传递给 Spring CRUD 存储库的保存方法

转载 作者:行者123 更新时间:2023-11-30 07:43:06 26 4
gpt4 key购买 nike

假设我们有三个具有名称和 ID 的 JPA 对象。我用 getters+setters 为 name 和 id 创建了一个接口(interface)。

class Car implements MetadataObject
class Bus implements MetadataObject
class Train implements MetadataObject

我们还有三个用于这些 JPA 对象的存储库:

interface CarRepository extends CrudRepository<Car, Long>
interface BusRepository extends CrudRepository<Bus, Long>
interface TrainRepository extends CrudRepository<Train, Long>

对于这些对象中的每一个,我们都希望在 spring 服务中运行相同的方法。 (高度简化)

private void importMetadata(CrudRepository<? extends MetadataObject, String> mRepository) {
Optional<? extends MetadataObject> currentOptional = mRepository.findById(1);

if (currentOptional.isPresent()) {
MetadataObject current = (MetadataObject) currentOptional.get();
current.setName("a1");
mRepository.save(current);
}
}

可由同一个 spring 服务调用

@Autowired
private CarRepository carRepository;
...
importMetadata(carRepository);

这会导致错误:

The method save(S) in the type CrudRepository<capture#4-of ? extends MetadataObject, Long> is not applicable for the arguments (MetadataObject)

如果我查看 Springs CRUD 存储库,这很奇怪:CrudRepository<T, ID>及其保存方法:<S extends T> S save(S entity); .

在我们的示例中,我们有 T = ? extends MetadataObjectS = ? extends ? extends MetadataObjects .

如果我们将函数更改为 private void importMetadata(CrudRepository<MetadataObject, String> bdbRepository)保存方法是正确的,但我不能再用我的 carRepository 调用该方法

The method importMetadata(CrudRepository<MetadataObject,String>) in the type <...> is not applicable for the arguments (CarRepository)

请注意:我高度简化了示例。我知道在此示例中,这些 JPA 类的接口(interface)毫无意义。我也知道我的方法没有意义,但它完美地突出了问题。

我的问题是:要传递什么来保存或如何重写它起作用的函数?这到底是什么问题?

最佳答案

你可以使用这个方法定义:

private void <T extends MetadataObject>importMetadata(CrudRepository<T, String> mRepository) {
Optional<T> currentOptional = mRepository.findById(1);

if (currentOptional.isPresent()) {
T current = currentOptional.get();
current.setName("a1");
mRepository.save(current);
}
}

关于java - 如何将泛型传递给 Spring CRUD 存储库的保存方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53776395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com