可用版本: Dev (3.21) | 最新 (3.20) | 3.19 | 3.18

转换模式

适用于 ❌ 开源版   ✅ Express 版   ✅ 专业版   ✅ 企业版

处理这些事件的 SPI 方法是 transformPattern()。此诊断完全取决于 转换模式特性

可以识别各种模式,并出于以下任何原因将其转换为更好的模式

  • 生成的表达式更加“规范化”。这客观上不会影响大多数 RDBMS 上的查询执行,而纯粹是一种风格上的改进。
  • 生成的表达式更简单。这也不会客观上影响大多数 RDBMS 上的查询执行。
  • 生成的表达式会删除不必要的部分。除非 RDBMS 可以自行转换此类表达式,否则这可能会客观地改善查询执行。

为什么这不好?

如果表达式未以这种方式进行规范化和简化,则会在您的 RDBMS 中产生过多的工作

  • 如果存在不必要的部分,某些 RDBMS 可能会执行太多不必要的工作,如果它们没有实现与 jOOQ 相同的转换。
  • 类似的表达式可能等效,但在语法上并不相同。因此,大多数 RDBMS 将必须解析语句两次,从而导致重复语句。重复语句诊断也检测这些情况,但不会报告两个语句重复的确切原因。此处的诊断有助于查看详细信息。

这里给出了一个例子

// A custom DiagnosticsListener SPI implementation
class TransformPatterns implements DiagnosticsListener {
    @Override
    public void transformPattern(DiagnosticsContext ctx) {
        System.out.println("Pattern transformation is possible from: " + ctx.part() + " to: " + ctx.transformedPart());
    }
}

然后

// Configuration is configured with the target DataSource, SQLDialect, etc. for instance Oracle.
try (Connection c = DSL.using(configuration.derive(new TransformPatterns()))
                       .diagnosticsConnection();
     Statement s = c.createStatement()) {

    try (ResultSet rs = s.executeQuery("SELECT * FROM author WHERE x = 1 OR x > 1")) {
        // ..
    }
}

引用此页

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo