gpt4 book ai didi

java - jOOQ mock : Why does insert require me to prepare a MockResult for a subsequent select?

转载 作者:行者123 更新时间:2023-11-30 05:30:05 25 4
gpt4 key购买 nike

我有一个 jOOQ MockConnection/DSL 设置用于单元测试,能够执行 insert ,但在我的测试的至少一个实例中,我还必须为后续的 select 语句实现 MockResult。

我的问题是,为什么jOOQ执行org.jooq.impl.AbstractDMLQuery#executeReturningGeneratedKeysFetchAdditionalRows中的select语句-> selectReturning为了我的插入?

我的插入内容很简单myRecord.insert() ,模拟的 DSL 看起来像这样:

// Simplified
var connection = new MockConnection(ctx -> {
var sql = ctx.sql();
if (sql.startsWith("insert")) {
return mockResultCount(1); // Impl elsewhere
}
return null;
});
var dsl = DSL.using(connection, SQLDialect.MYSQL);

[...]

var myRecord = new MyRecord();
myRecord.setX(...).setY(...);

dsl.attach(myRecord);

// Why does this require a mocked insert result AND a mocked select result?
myRecord.insert();

我的测试失败了,因为 jOOQ 需要 DSL 返回像 SELECT ID_COLUMN, UNIQUE_KEY_COLUMN WHERE UNIQUE_KEY_COLUMN = ? 这样的选择的结果

我唯一能想到的是这个表有一个唯一的键?

任何人都知道为什么一个简单的 record.insert();需要执行 select 语句吗?

最佳答案

这取决于多种因素。

  • 首先是方言。例如,MySQL 无法通过 JDBC 的 Statement.getGenerateKeys() 获取除标识值之外的值。这是可能存在额外查询的主要原因。

  • 然后,例如您的 Settings.returnAllOnUpdatableRecord配置可能会导致此行为。如果您已打开此功能,则需要在 MySQL 中进行单独的查询来获取非身份值。

  • 或者,如果您的身份列(在 MySQL 中,AUTO_INCRMENT 列)与您的主键不一致,这似乎是您记录的 SQL 语句的情况,您可以在其中区分介于 ID_COLUMNUNIQUE_KEY_COLUMN 之间。

进行此获取的原因是 jOOQ 假设可以生成此类值(例如通过触发器)。我猜特殊情况是这样的

  • 身份和主键不一致
  • 主键已由用户完全提供

我们可以尝试不获取可能生成的主键值,而仅获取身份值。我为此创建了一个功能请求:https://github.com/jOOQ/jOOQ/issues/9125

关于java - jOOQ mock : Why does insert require me to prepare a MockResult for a subsequent select?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57748205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com