Hibernate 硬编码变量名

Hibernate 硬编码变量名,hibernate,switch-statement,Hibernate,Switch Statement,我目前正在接受培训,我被指派编写代码,使用带有hibernate和sql DB的java来维护和持久化对象 我观察到,在许多情况下,我必须使用switch语句和持久化实体的硬编码变量名,我发现这个解决方案很难维护,也不灵活(我的车辆类的所有可能变量至少有4个不同的类) 我曾向我的导师建议,也许解决方案是使用可能的变量名的最终数组并将其用于迭代,但有人告诉我这个解决方案不好(没有进一步解释) 我试图为我的问题找到好的例子,但我失败了 我的问题是,在查询、实体更新等情况下,处理变量的最佳解决方案是什

我目前正在接受培训,我被指派编写代码,使用带有hibernate和sql DB的
java
来维护和持久化对象

我观察到,在许多情况下,我必须使用switch语句和持久化实体的硬编码变量名,我发现这个解决方案很难维护,也不灵活(我的车辆类的所有可能变量至少有4个不同的类)

我曾向我的导师建议,也许解决方案是使用可能的变量名的最终数组并将其用于迭代,但有人告诉我这个解决方案不好(没有进一步解释)

我试图为我的问题找到好的例子,但我失败了

我的问题是,在查询、实体更新等情况下,处理变量的最佳解决方案是什么

编辑

根据要求,我提供了我遇到问题的代码示例。这是我的
Query
class

public class VehicleQueryCriteria extends QueryCriteria<DBVehicle> {
    private Object[] argumentValue = new Object[1];
    private String[] argumentName = new String[1];
    private CompareEnum[] relation = new CompareEnum[1];

    public VehicleQueryCriteria(String argumentName, CompareEnum relation, Object argumentValue){
        this.argumentValue[0] = argumentValue;
        this.relation[0] = relation;
        this.argumentName[0] = argumentName;
    }

    @Override
    public Object[] getValues() {
        return this.argumentValue;
    }

    @Override
    public String[] getValueName() {
        return this.argumentName;
    }

    @Override
    public CompareEnum[] getRelations() {
        return this.relation;
    }
}
公共类车辆QueryCriteria扩展了QueryCriteria{
私有对象[]argumentValue=新对象[1];
私有字符串[]argumentName=新字符串[1];
私有CompareEnum[]关系=新的CompareEnum[1];
public VehicleQueryCriteria(字符串参数名称、比较项关系、对象参数值){
this.argumentValue[0]=argumentValue;
关系[0]=关系;
this.argumentName[0]=argumentName;
}
@凌驾
公共对象[]getValues(){
返回此.argumentValue;
}
@凌驾
公共字符串[]getValueName(){
返回此.argumentName;
}
@凌驾
公共比较{
返回此关系;
}
}
使用抽象超类中的另一个方法

public void accept(QueryVisitor QueryVisitor){QueryVisitor.visitQuery(this);}

其中,查询访问者使用以下方法创建验证器对象

private static Validator<DBVehicle> parse(String argumentName, Object argumentValue, CompareEnum relation){
    switch (argumentName){
        case "id":
            return VehicleValidator.create(relation, (UUID)argumentValue, DBVehicle::getId);
        case "vinNumber":
            return VehicleValidator.create(relation, (String)argumentValue, DBVehicle::getVinNumber);
        case "productionDate":
            return VehicleValidator.create(relation, (Date)argumentValue, DBVehicle::getProductionDate);
        case "plateNumber":
            return VehicleValidator.create(relation, (String)argumentValue, DBVehicle::getPlateNumber);
        case "manufacturer":
            return VehicleValidator.create(relation, (String)argumentValue, DBVehicle::getManufacturer);
        case "horsePower":
            return VehicleValidator.create(relation, (Integer)argumentValue, DBTruck::getHorsePower);
        case "mileage":
            return VehicleValidator.create(relation, (Integer)argumentValue, DBTruck::getMileage);
        case "volume":
            return VehicleValidator.create(relation, (Integer)argumentValue, DBTrailer::getVolume);
        default:
            throw new IllegalArgumentException("Parameter name \"" + argumentName+ "\" is not valid Vehicle parameter");
    }
}
private静态验证器解析(字符串argumentName、对象argumentValue、CompareEnum关系){
开关(参数名称){
案例“id”:
返回VehicleValidator.create(关系,(UUID)参数值,DBVehicle::getId);
案例“编号”:
返回VehicleValidator.create(关系,(字符串)参数值,DBVehicle::getVinNumber);
案例“生产日期”:
返回VehicleValidator.create(关系,(日期)参数值,DBVehicle::getProductionDate);
案例“车牌号”:
返回VehicleValidator.create(关系,(字符串)参数值,DBVehicle::getPlateNumber);
案例“制造商”:
返回VehicleValidator.create(关系,(字符串)参数值,DBVehicle::getManufacturer);
案例“马力”:
返回VehicleValidator.create(关系,(整数)参数值,DBTruck::getHorsePower);
案例“里程”:
返回VehicleValidator.create(关系,(整数)参数值,DBTruck::GetMiledge);
案例“卷”:
返回VehicleValidator.create(关系,(整数)参数值,DbTraile::getVolume);
违约:
抛出新的IllegalArgumentException(“参数名\”+argumentName+“\”不是有效的车辆参数”);
}
}

CompareEnum
是包含一组比较器的枚举,如
大于
等于
验证器
是具有一个方法方法的对象
验证
,该方法接受“BDVehicle”并返回布尔值。
Query
Validator
都是可伸缩的,可以在复合类中轻松聚合,我对这个解决方案非常满意。唯一困扰我的是这个switch语句

有任何代码可以共享来说明您的问题吗?在更新方法中,我使用包含我要更新的参数的map(
)。在这个方法中,我需要根据一些硬编码的可能键值列表来验证这些名称,然后我使用键和用于更新实体的函数进行切换。在另一个地方,我有我的
QueryCriteria
类,它包含类似的信息,另外还有一些关系(较大、较小、相等等)。当我创建hibernate
Query
对象时,我必须再次使用硬编码的参数名。我处理代码的次数越多,这些类型的东西传播到不同的类的次数就越多……您的一些顾虑可以通过使用重构来解决。您可能需要阅读关于关注点分离、单一责任原则和设计模式(如策略模式)的相关内容。根据您创建查询字符串的方式,这些字符串通常是硬编码的。包装查询的方法通常是命名良好的、自文档化的,用于解释预期的输入和输出等。如果您需要更多帮助,请使用您的代码更新您的帖子,以便我们能够实际看到它。