如何构建使用inheritancetype.single表的子对象?

2j4z5cfb  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(367)

我有几个对象都是一个类的子对象。我正在使用spring hibernate inheritancetype.single\表将它们存储到数据库中。
我有一个返回任何子对象的方法:

public Optional<? extends Product> getProductByID(long productId) {
        LOGGER.info("Returning product with ID: " + productId);
        return productDao.findById(productId);
    }

在编写导入时,我知道对象类型是什么。如何构建特定对象并访问特定于该子对象的getter和setter?
我可以使用单独的方法和单独的存储库来完成它:

public Optional<Cassette> getCassetteByID(long productId) {
        LOGGER.info("Getting Cassette with ID: {} from DB", productId);
        return cassetteDao.findById(productId);
    }

有没有可能用一个带if语句的方法来代替呢?像这样:

public Optional<? extends Product> getProductByID(long productId) {
        LOGGER.info("Returning product with ID: " + productId);
        if (productId <= 4) {
            return brakeDao.findById(productId);
        } else if (productId <= 9) {
            return cassetteDao.findById(productId);
        } else {
            return productDao.findById(productId);
        }
    }

对不起,我的问题冗长,我不太清楚如何界定这个问题。我想有一个完整的对象,这样我可以得到具体的数据和改变的东西需要。

e4yzc0pl

e4yzc0pl1#

您可以有一个泛化的方法,您可以在调用站点指定所需的类型。比如:

public <T> Optional<T extends Product> getProductByID(long productId) {
        LOGGER.info("Returning product with ID: " + productId);
        Product result = productDao.findById(productId);
        if (result instance of T) return result;
        else return Optional.empty();
    }

在呼叫站点上,您将使用:

Cassette received = myServiceClassInstance.<Cassette>getProductById(124);

尽管在大多数情况下,这可能不是做事的首选方法。您还可以按t类型切换以委托给特定的dao,但这可能更糟,因为继承树中的更改意味着您必须修改该切换。

相关问题