You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jOOQ行值表达式触发运行时错误

jOOQ row()语法在MariaDB下的SQL语法错误解决方法

问题现象

使用jOOQ的row()语法构建嵌套记录查询时,抛出SQL语法错误异常。移除row()相关代码后查询可正常执行。生成的SQL中包含类似v8.userId的带前缀别名,不符合MariaDB语法规范,手动移除前缀后SQL可正常运行。涉及技术版本:jOOQ 3.19.9、MariaDB 10.10.7、Quarkus 3.9.5。

解决办法

1. 显式指定row()内字段的别名

为嵌套记录中的每个字段手动设置别名,避免jOOQ自动生成带前缀的别名:

record ProductItem(Long productId, BigDecimal price, UserItem creator) {
}
record UserItem(Integer userId, String email) {
}

return dsl()
    .select(
        PRODUCT.PRODUCTID,
        PRODUCT.PRICE,
        row(
            PRODUCT.fk_product_creatorId().USERID.as("userId"),
            PRODUCT.fk_product_creatorId().EMAIL.as("email")
        ).mapping(UserItem::new))
    .fetch(Records.mapping(ProductItem::new));

2. 全局禁用嵌套记录的自动别名前缀

通过jOOQ配置关闭自动生成嵌套记录别名前缀的功能:

  • Quarkus配置文件方式:在application.properties中添加:
quarkus.jooq.settings.render-nested-record-aliases=false
  • 代码配置方式:
DSLContext dsl = DSL.using(
    yourConnection, 
    SQLDialect.MARIADB, 
    new Settings().withRenderNestedRecordAliases(false)
);

原理说明

jOOQ默认会为嵌套记录的字段生成带自动前缀(如v8)的别名,但MariaDB不支持这种别名引用格式。通过显式指定别名或关闭自动前缀生成,可让生成的SQL符合MariaDB语法要求。

内容的提问来源于stack exchange,提问作者funkrusher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:52:08