Hibernate 硬编码变量名
我目前正在接受培训,我被指派编写代码,使用带有hibernate和sql DB的Hibernate 硬编码变量名,hibernate,switch-statement,Hibernate,Switch Statement,我目前正在接受培训,我被指派编写代码,使用带有hibernate和sql DB的java来维护和持久化对象 我观察到,在许多情况下,我必须使用switch语句和持久化实体的硬编码变量名,我发现这个解决方案很难维护,也不灵活(我的车辆类的所有可能变量至少有4个不同的类) 我曾向我的导师建议,也许解决方案是使用可能的变量名的最终数组并将其用于迭代,但有人告诉我这个解决方案不好(没有进一步解释) 我试图为我的问题找到好的例子,但我失败了 我的问题是,在查询、实体更新等情况下,处理变量的最佳解决方案是什
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
类,它包含类似的信息,另外还有一些关系(较大、较小、相等等)。当我创建hibernateQuery
对象时,我必须再次使用硬编码的参数名。我处理代码的次数越多,这些类型的东西传播到不同的类的次数就越多……您的一些顾虑可以通过使用重构来解决。您可能需要阅读关于关注点分离、单一责任原则和设计模式(如策略模式)的相关内容。根据您创建查询字符串的方式,这些字符串通常是硬编码的。包装查询的方法通常是命名良好的、自文档化的,用于解释预期的输入和输出等。如果您需要更多帮助,请使用您的代码更新您的帖子,以便我们能够实际看到它。