Java 如何使用jooq批量更新

Java 如何使用jooq批量更新,java,jooq,Java,Jooq,使用以下方法使用jOOQ进行更新 for (Balance balance : balances) { dslContext.update(BALANCE) .set(BALANCE.AMOUNT, balance.getAmount()) .where(BALANCE.ID.eq(balance.getId)) .execute(); } 这将迭代所有余额并插入每个余额。我知道

使用以下方法使用jOOQ进行更新

for (Balance balance : balances) {
       dslContext.update(BALANCE)
                 .set(BALANCE.AMOUNT, balance.getAmount())
                 .where(BALANCE.ID.eq(balance.getId))
                 .execute();
}
这将迭代所有余额并插入每个余额。我知道这可以用UpdateableRecord来完成。但是
我想避免从数据库中获取余额。Balance是一个包含8个以上字段的表,但我只想更新一个字段。在没有UpdateableRecord的情况下,是否有其他方法可以做到这一点?

您的代码很好,但您可以像这样使用批更新:

List<UpdateConditionStep<BalanceRecord> updates = new ArrayList<>();
for (Balance balance : balances) {
   updates.add(dslContext.update(BALANCE)
             .set(BALANCE.AMOUNT, balance.getAmount())
             .where(BALANCE.ID.eq(balance.getId)));
}

dslContext.batch(updates).execute();
文件:


提示:如果您在未锁定的情况下更新余额,请小心丢失的更新。

您的代码很好,但您可以使用以下批量更新:

List<UpdateConditionStep<BalanceRecord> updates = new ArrayList<>();
for (Balance balance : balances) {
   updates.add(dslContext.update(BALANCE)
             .set(BALANCE.AMOUNT, balance.getAmount())
             .where(BALANCE.ID.eq(balance.getId)));
}

dslContext.batch(updates).execute();
文件:

只是一个提示:如果在不锁定的情况下更新余额,请小心更新丢失。

使用UpdateableRecord的批处理语句 如果希望方便,您仍然可以使用UpdateableRecord,而无需首先从数据库中获取所有记录。假设您正在使用代码生成器并正在生成记录,您将拥有BalanceRecord:

ctx.batchUpdatebalances 流动 .mapb->{ var r=新的平衡记录; r、 setAmountb.getAmount; r、 setIdb.getId; r、 changedBALANCE.ID,false;//防止将ID设置为自身 返回r; } .收藏家 处决 这将为你创造一个幕后的机会

使用批处理连接 从jOOQ 3.14开始,您可以使用一个特殊的JDBC连接代理透明地批处理所有逻辑,该代理会延迟jOOQ创建或未创建的所有JDBC语句的执行,并对它们进行缓冲,直到需要执行为止:

dslContext.batchedc->{ 余额:余额{ c、 dsl.updateBALANCE .setBALANCE.AMOUNT,balance.getAmount .whereBALANCE.ID.eqbalance.getId .execute;//这尚未执行查询 } }//现在,缓冲查询正在批量执行 运行单个批量语句 从您的评论来看,似乎希望将其作为一条批量语句运行,而不是在一条批处理语句中对多条语句进行批处理

我不相信这是正确的方法-语句可能会变得庞大,并且不一定比批处理快,但是当然,您可以使用

ctx.updateBALANCE .余额, case_BALANCE.ID.mapValues balances.stream.collecttoMapbalance::getId,balance::getValue .whereBALANCE.ID.inbalances.stream.mapbalance::getId.collecttoList 处决 这将产生如下结果:

更新余额 设定金额= 病例id 当1时,则为2.50 当2时,则为3.50 13点到8点30分 终止 其中id在1,2,13中 根据您使用的方言,使用MERGE可能会更好:

趋于平衡 使用 值1,2.50,2,3.50,13,8.30 作为s i,b 总的来说,1.id=s.i 和balance.balance=s.b 匹配后,更新集合余额=b 使用UpdateableRecord的批处理语句 如果希望方便,您仍然可以使用UpdateableRecord,而无需首先从数据库中获取所有记录。假设您正在使用代码生成器并正在生成记录,您将拥有BalanceRecord:

ctx.batchUpdatebalances 流动 .mapb->{ var r=新的平衡记录; r、 setAmountb.getAmount; r、 setIdb.getId; r、 changedBALANCE.ID,false;//防止将ID设置为自身 返回r; } .收藏家 处决 这将为你创造一个幕后的机会

使用批处理连接 从jOOQ 3.14开始,您可以使用一个特殊的JDBC连接代理透明地批处理所有逻辑,该代理会延迟jOOQ创建或未创建的所有JDBC语句的执行,并对它们进行缓冲,直到需要执行为止:

dslContext.batchedc->{ 余额:余额{ c、 dsl.updateBALANCE .setBALANCE.AMOUNT,balance.getAmount .whereBALANCE.ID.eqbalance.getId .execute;//这尚未执行查询 } }//现在,缓冲查询正在批量执行 运行单个批量语句 从您的评论来看,似乎希望将其作为一条批量语句运行,而不是在一条批处理语句中对多条语句进行批处理

我不相信这是正确的方法-语句可能会变得庞大,并且不一定比批处理快,但是当然,您可以使用

ctx.updateBALANCE .余额, case_BALANCE.ID.mapValues balances.stream.collecttoMapbalance::getId,balance::getValue .whereBALANCE.ID.inbalances.stream.mapbalance::getId.collecttoList 处决 这将产生如下结果:

更新余额 设定金额= 病例id 当1时,则为2.50 当2时,则为3.50 13点到8点30分 终止 其中id在1,2,13中 根据您使用的方言,这可能更好地使用 合并:

趋于平衡 使用 值1,2.50,2,3.50,13,8.30 作为s i,b 总的来说,1.id=s.i 和balance.balance=s.b 匹配后,更新集合余额=b
看起来它没有使用绑定值?没有?执行的SQL看起来如何?这对应于批处理几个不一定相关的语句。对于JDBC,这不能使用绑定变量来完成。您正在寻找的是在同一页面上批处理单个查询并使用bind…(绑定…)提供绑定变量集:看起来它没有使用绑定值?没有?执行的SQL看起来如何?这对应于批处理几个不一定相关的语句。对于JDBC,这不能使用绑定变量来完成。您正在寻找的是批处理单个查询,并在同一页面上使用bind…(绑定…)提供绑定变量集:您的id、金额对来自何处?我从外部服务接收余额列表。因此,对于这种方法,它是通过方法参数来实现的。您的id、金额对来自哪里?我从外部服务接收余额列表。因此,对于该方法,它是通过方法参数扫描,您还提供了一个将其与MERGE语句/onDuplicateKeyUpdate一起使用的示例?DSLContext.batchMerge仅在jOOQ 3.14中添加,目前尚未发布。您只需将BATCHUPDATE调用更改为BATCHMERGEAT代码生成查询,该查询只考虑Id在WHERE子句中进行更新。如何在where子句中添加更多条件?@pppavan:您按照的建议编写了一个显式查询,但使用上述查询不会生成批更新,而是生成许多更新查询。batchUpdate的工作原理是否与报告中的batchInsert类似?您能否提供一个将其与MERGE语句/onDuplicateKeyUpdate一起使用的示例?DSLContext.batchMerge仅在jOOQ 3.14中添加,目前尚未发布。您只需将BATCHUPDATE调用更改为BATCHMERGEAT代码生成查询,该查询只考虑Id在WHERE子句中进行更新。如何在where子句中添加更多条件?@pppavan:您按照的建议编写了一个显式查询,但使用上述查询不会生成批更新,而是生成许多更新查询。batchUpdate的工作方式是否与报告的batchInsert类似