循环遍历数据库列时uniqueResult方法调用报错的解决方法咨询
如何通过字符串向量自动化查询数据库并填充节点向量?
问题描述
我有一个数据库表,每行代表一个配送任务:
- 第一列是配送任务的专属名称
- 其余列是节点名称(如
pad_1、pad_2、pad_3等),列中值非0表示需要到达该节点
在主程序里我有一个字符串向量,包含了这个表的所有列名。现在有一个事件会在特定配送时间触发函数,我希望在这个函数里遍历对应配送任务的行,把非0的节点内容填充到一个节点向量中。
我尝试通过遍历字符串向量来自动化数据库查询,写了这段代码:
int [] Pad = new int[n_pc]; for (int i=0;i< n_pc;i++){ Pad[i]=selectFrom(farmacia_clinica).where(farmacia_clinica.fascia.eq(FASCIA_A)).uniqueResult(farmacia_clinica.PAD_FarmaciaClinica[i]); }
但报错在最后一行的uniqueResult(farmacia_clinica.PAD_FarmaciaClinica[i]),请问该怎么解决?
问题根源
你这里踩了个典型的ORM框架使用误区:farmacia_clinica.PAD_FarmaciaClinica[i]这种写法根本行不通。从代码风格看你应该用的是JOOQ这类ORM,在Java里,实体类的数据库字段是固定的成员变量,不是数组元素,没法通过索引下标直接调用。
解决方案
根据你使用的JOOQ框架,给你三种可行的实现思路,按需选择:
1. 通过字段名字符串动态获取Field对象
如果你已经有存储列名的字符串列表(比如List<String> columnNames),可以用JOOQ提供的field()方法,根据列名字符串拿到对应的Field<Integer>对象,再执行查询:
// 假设columnNames里第一个元素是任务名字段,从第1位开始是pad_*列 List<String> columnNames = ...; int[] Pad = new int[n_pc]; for (int i = 0; i < n_pc; i++) { // 动态获取当前列的Field对象 Field<Integer> targetField = farmacia_clinica.field(columnNames.get(i+1), Integer.class); // 执行查询赋值 Pad[i] = selectFrom(farmacia_clinica) .where(farmacia_clinica.fascia.eq(FASCIA_A)) .uniqueResult(targetField); }
2. 一次性查询整行,再遍历取值(推荐)
反复执行单字段查询会增加数据库IO开销,更高效的方式是先把目标行完整查出来,再从结果里提取需要的字段值:
// 先查询整行数据 Record taskRecord = selectFrom(farmacia_clinica) .where(farmacia_clinica.fascia.eq(FASCIA_A)) .fetchOne(); int[] Pad = new int[n_pc]; List<String> columnNames = ...; for (int i = 0; i < n_pc; i++) { // 从已查询的record中直接取值 Pad[i] = taskRecord.getValue(columnNames.get(i+1), Integer.class); }
3. 预定义字段数组(适合列名固定的场景)
如果你的pad_*列数量固定、名称不变,可以提前把所有对应的Field对象存入数组,直接遍历数组即可:
// 提前定义好所有pad列的Field数组 Field<Integer>[] padFields = new Field[]{ farmacia_clinica.pad_1, farmacia_clinica.pad_2, farmacia_clinica.pad_3, // 按顺序添加所有pad_*字段 }; int[] Pad = new int[n_pc]; for (int i = 0; i < n_pc; i++) { Pad[i] = selectFrom(farmacia_clinica) .where(farmacia_clinica.fascia.eq(FASCIA_A)) .uniqueResult(padFields[i]); }
额外提醒
- 如果
pad_*列允许NULL值,记得在取值时加非空判断,比如用taskRecord.getValue(targetField, Integer.class, 0)设置默认值,避免空指针异常 - 优先选第二种方案,减少数据库交互次数,性能更好
内容的提问来源于stack exchange,提问作者Miriana
相关产品推荐
相关产品推荐

