Java 如何在使用jooq创建查询字符串时转义单引号?

Java 如何在使用jooq创建查询字符串时转义单引号?,java,sql,jooq,Java,Sql,Jooq,我试图用以下方法创建一个jooq查询字符串 DSL.using(SQLDialect.MYSQL) .select( ImmutableList.of(DSL.field("Name")) .from(DSL.table("Account")) .where(DSL.field("Name").eq("Yaswanth's Company"))).toString() 结果查询字符串

我试图用以下方法创建一个jooq查询字符串

DSL.using(SQLDialect.MYSQL)
            .select(
                    ImmutableList.of(DSL.field("Name"))
            .from(DSL.table("Account"))
            .where(DSL.field("Name").eq("Yaswanth's Company"))).toString()
结果查询字符串使用另一个单引号对单引号进行转义,这是mySQL转义单引号的默认方式

"select Name from Account where Name = 'Yaswanth''s Company'"
但是,在为salesforce生成查询字符串时,我需要使用反斜杠转义单引号。(称为SOQL)

我需要这样的查询字符串

"select Name from Account where Name = 'Yaswanth\\'s Company'"
我已经查看了jooq库代码,这是在DefaultBinding类中硬编码的

private final String escape(Object val, Context<?> context) {
    String result = val.toString();

    if (needsBackslashEscaping(context.configuration()))
        result = result.replace("\\", "\\\\");

    return result.replace("'", "''");
}
私有最终字符串转义(对象val,上下文){
字符串结果=val.toString();
if(需要backslashescaping(context.configuration()))
结果=结果。替换(“\\”,“\\\”;
返回结果。替换(“,”);
}

是否有一种方法可以通过DSL传递的配置或设置来覆盖此默认行为。使用(*,*)?

大多数SQL数据库都遵循将单引号加倍以进行转义的SQL标准,但使此功能可配置无疑是有意义的。我们可能会在JooQ3.10中使用

同时,最好的解决方法是为所有字符串类型编写自己的代码,并在生成SQL字符串时重写
DefaultBinding
行为。大致如下:

代码生成配置 使用

你每次都要记住这一点

<forcedType>
    <userType>java.lang.String</userType>
    <binding>com.example.AlternativeEscapingStringBinding</binding>
    <!-- add other vendor-specific string type names here -->
    <types>(?i:N?(VAR)?CHAR|TEXT|N?CLOB)</types>
</forcedType>
public class AlternativeEscapingStringBinding implements Binding<String, String> {
    ...

    @Override
    public void sql(BindingSQLContext<String> ctx) throws SQLException {
        if (ctx.paramType() == ParamType.INLINED) 
            if (ctx.value() == null)
                ctx.render().sql('null');
            else
                ctx.render()
                   .sql('\'')
                   .sql(ctx.value().replace("'", "\\'"))
                   .sql('\'');
        else
            ctx.render().sql('?');
    }
}
DSL.field("Name", SQLDataType.VARCHAR
                             .asConvertedDataType(new AlternativeEscapingStringBinding()));