当前位置: 首页 > 知识库问答 >
问题:

jooq记录在获取数据时是否使用列索引?

阎博易
2023-03-14

我正在调查一个问题,在这个问题上,我们看到了与jooq尝试填充生成的记录类相关的奇怪异常,因为它使用java.sql,所以会出现数据类型错误。结果集::getXXX(int)(基于列索引)以获取数据。

我可以共享的堆栈跟踪部分如下所示:

Caused by: java.sql.SQLDataException: Value 'ABC' is outside of valid range for type java.lang.Byte
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:114)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:92)
    at com.mysql.cj.jdbc.result.ResultSetImpl.getObject(ResultSetImpl.java:1423)
    at com.mysql.cj.jdbc.result.ResultSetImpl.getByte(ResultSetImpl.java:710)
    at com.zaxxer.hikari.pool.HikariProxyResultSet.getByte(HikariProxyResultSet.java)
    at org.jooq.tools.jdbc.DefaultResultSet.getByte(DefaultResultSet.java:124)
    at org.jooq.tools.jdbc.DefaultResultSet.getByte(DefaultResultSet.java:124)
    at org.jooq.impl.CursorImpl$CursorResultSet.getByte(CursorImpl.java:688)
    at org.jooq.impl.DefaultBinding$DefaultByteBinding.get0(DefaultBinding.java:1783)
    at org.jooq.impl.DefaultBinding$DefaultByteBinding.get0(DefaultBinding.java:1755)
    at org.jooq.impl.DefaultBinding$AbstractBinding.get(DefaultBinding.java:871)
    at org.jooq.impl.CursorImpl$CursorIterator$CursorRecordInitialiser.setValue(CursorImpl.java:1725)

这肯定是使用错误的列索引导致的列不匹配。

出现这个问题是因为我们在不断发展的模式上使用记录,所以底层表包含记录定义中不可用的列。

请注意,触发此操作的实际代码是:

jooq.insertInto(TABLE)
    .set(TABLE.COL, "ABC")
    .returning(TABLE.asterisk())
    .fetchOne();

这里让我有点害怕的是,如果它确实设计使用列索引,这将使模式演变有点困难(您如何从正在运行的应用程序中删除列)。

长话短说(对不起),问题是:jooq是否在jooq生成器生成的记录中使用列索引,是否有办法改用列名?

我注意到的一件事是,当我在https://www.jooq.org/doc/3.14/manual/code-generation/codegen-records/显示的生成记录与生成器实际生成的记录不匹配。文档显示了以下方法:

// Every column generates a setter and a getter
@Override
public void setId(Integer value) {
    setValue(BOOK.ID, value);
}

但实际上生成的代码看起来像(取自jOOQ示例):

/**
 * Setter for <code>PUBLIC.BOOK.ID</code>.
 */
public void setId(Integer value) {
    set(0, value);
}

顺便说一句,我们使用的是jooq 3.14.15。

共有1个答案

许俊风
2023-03-14

好吧,这是一个本地错误。实际上导致问题的原因是我们的代码被编写为:

jooq.insertInto(TABLE)
    .set(TABLE.COL, "ABC")
    .returning(TABLE.asterisk())
    .fetchOne();

和<代码>表。asterisk()是造成混乱的原因(因为在包含额外列的数据库中,它不会返回jooq期望的结果)。幸运的是,删除它可以解决问题,因此我们的代码现在看起来像:

jooq.insertInto(TABLE)
    .set(TABLE.COL, "ABC")
    .returning()
    .fetchOne();
 类似资料:
  • 我一直在使用模式。方法来获取模式中的表列表,但今天我发现该方法返回的是执行jOOQ代码生成时存在的表列表,而不是此时存在的表。 我的具体用例是随着时间的推移创建表(自动分区),我们的Java服务对它们执行一些操作。 在jOOQ中有没有办法从DB中获取当前的表列表? 我可以求助于查询信息模式。直接使用表,但我更愿意重用来自jOOQ的方法(如果可用的话)。

  • 我目前正在开发一个应用程序,它将为不同的目的生成两个不同的日志文件。因为我是log4j2新手,所以无法实现它。这是我的配置文件(log4j2.xml): 我不确定我是否用了正确的方法。下面是我的java方法,它试图使用log4j2进行日志记录 谢谢

  • 问题内容: 尽管在某些教程中,例如此处( 参数化日志记录 部分),他说Logback消息参数化可以帮助我们避免 在日志数据中进行不必要的计算 (如果日志记录级别不是DEBUG): 我测试(的logback上的版本),这个优化仅适用于不必要的参数对象的- 因为这作品的 log4j的 。 Logback 文档未涵盖此详细信息。 因此,我们必须对所有“昂贵”的日志记录使用isDebugEnabled()

  • 我的数据库表如下所示 我想要得到所有的一周的时间,有多少任务是在星期一,星期二...星期五创建的。如有任何帮助,我们将不胜感激。

  • 目前我正在从pojos列表映射到记录,我希望能够一次插入多行。我如何在JOOQ中用一个事务做到这一点? 我曾尝试将列表放入“值”中,但出现异常“值的数量必须与字段的数量匹配”

  • 问题内容: List rateList = guestList.stream() .map(guest -> buildRate(ageRate, guestRate, guest)) .collect(Collectors.toList()); 在上面的代码中,可以通过内部方法的索引。我在构建时还需要传递索引,但无法通过获取索引。 问题答案: 您尚未提供的签名,但是我假设您希望首先传递元素的索引