AnyLogic:从内部数据库直接查询数据到模型类的正确方法
解决AnyLogic数据库查询结果直接映射到模型类的问题
嘿,我来帮你搞定这个AnyLogic里的数据库查询映射痛点!你不想手动用Tuple提取值的想法完全合理,下面给你讲两种靠谱的解决方案,先帮你理清之前的错误原因:
为什么用Q类会报错?
你提到的Qproduct_innovation_level是AnyLogic自动生成的查询元模型类,它的作用是帮你构建查询条件(比如指定where子句里的字段),而不是用来存储实际查询到的数据。所以它的属性(比如level_customer)是NumberExpression<Integer>类型的查询表达式,不是具体的数值,直接赋值给int自然会报类型不匹配错误。
最优方案:用AnyLogic自动生成的实体类
如果你是在AnyLogic的内置数据库中创建的product_innovation_level表,系统已经自动帮你生成了对应的实体类(通常和表名对应,可能是驼峰命名,比如ProductInnovationLevel,或者和表名一致的Product_innovation_level,你可以在项目的Database目录下找到它)。
用这个实体类直接接收查询结果的写法非常简洁:
// 直接查询并获取实体对象 ProductInnovationLevel innovationLevel = selectFrom(product_innovation_level) .where(product_innovation_level.id.eq(1)) .first(); // 直接调用getter方法获取字段值 double ngCustomer = innovationLevel.getLevel_customer(); // 或者getLevelCustomer(),取决于自动生成的getter命名 double ngEmployee = innovationLevel.getLevel_employee();
这个方法完全不需要手动提取Tuple里的值,直接通过实体类的getter就能拿到对应字段的实际数值,完美符合你想要的写法!
备选方案:自定义模型类的映射方法
如果你一定要用自己定义的InnovationLevelModel类,那需要手动把查询结果映射到自定义类中,有两种方式:
方式1:从Tuple映射
// 先查询获取Tuple结果 Tuple result = selectFrom(product_innovation_level) .where(product_innovation_level.id.eq(1)) .firstResult(product_innovation_level.level_customer, product_innovation_level.level_employee); // 实例化自定义类并赋值 InnovationLevelModel innovationLevel = new InnovationLevelModel( result.get(product_innovation_level.level_customer), result.get(product_innovation_level.level_employee) );
方式2:从自动生成的实体类映射
// 先获取自动生成的实体对象 ProductInnovationLevel dbEntity = selectFrom(product_innovation_level) .where(product_innovation_level.id.eq(1)) .first(); // 转换为自定义模型类 InnovationLevelModel innovationLevel = new InnovationLevelModel( dbEntity.getLevel_customer(), dbEntity.getLevel_employee() );
这种方式需要你确保自定义类有对应的构造方法,或者提供setter方法来赋值。
内容的提问来源于stack exchange,提问作者JoKo
相关产品推荐
相关产品推荐

