我使用 jOOQ 生成 PlainSQL 查询,大部分遵循 ANSI SQL。 如果我正在处理某个字段的 SQL 语句,需要对其进行解析以验证它是否是正确的 SQL(我正在使用
DSL.using(SQLDialect.DEFAULT).parser().parseField(sqlString)
),但该字段生成的 sql 应使用平台本机语法和关键字,该怎么办?
考虑字段
TO_HEX(SHA256(CAST(userId AS string)))
的 SQL 语句示例(请注意,我已将 DSLContext
设置为忽略未知函数)。
当使用 parseField
解析它并检查生成的 SQL 时,它会被转换为 to_hex(SHA256(cast(userId as varchar)))
。然而,目标平台不支持varchar
。是否有任何选项可以指定如何例如应该渲染这样的演员?我已经查看了文档,但我似乎找不到如何覆盖特定关键字/定义我自己的方言。
您应该配置 2 种方言:
DSL.using()
的方言(对应于 Configuration.dialect()
)是 output 方言,即您应该将其设置为您的目标方言Settings.parseDialect
是input 方言。如果不支持您的方言,您可以保持不变。ParseListener
SPI,它允许覆盖某些语法元素的输入/输出行为。你不能用它来覆盖一切,但它至少应该适用于:
Field
表情Condition
表情Table
表情