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

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

池俊茂
2023-03-14

我试图创建一个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库代码,这是在Default绑定类中硬编码的

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

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

    return result.replace("'", "''");
}

我有没有办法通过DSL可以传递的配置或设置来覆盖这种默认行为。使用(*,*)?

共有1个答案

乌和畅
2023-03-14

大多数SQL数据库都遵循将转义的单引号加倍的SQL标准,但是让这个功能可配置当然是有意义的。我们可能会为jOOQ 3.10和#5873这样做。

与此同时,最好的解决方法是为所有String类型编写自己的数据类型绑定,并在生成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()));

你每次都要记住这一点。。。

 类似资料:
  • 我想构建一个cosmosdb sql查询,因为我使用的是rest接口,它接受sql查询(不要问为什么,我不能改变它:()... 你知道我有什么变通办法吗?或者可能只是一个很好的包,我可以用来转义我自己的字符串。 T

  • 我可以将替换为其他一些字符序列(例如)来执行字符串替换,但是如果我可以用正则表达式来替换,这将更加清楚。

  • 问题内容: 我想像这样在Bash中显示一个字符串 当然可以这样 但是如何在字符串周围使用单引号的同时完成此操作? 问题答案: 不起作用。但是以下工作原理: 在bash的手册页中: 即使在单引号之前加反斜杠,也不能在单引号之间引起单引号。 .... $’string’* 形式的单词经过特殊处理。该单词扩展为字符串,并按ANSI C标准的规定替换反斜杠转义字符。 *

  • 问题内容: 我不敢相信我在问这个,但是… 您如何使用SCALA在SPARK SQL中逃逸SQL查询字符串? 我已经厌倦了一切,到处搜寻。我以为apache commons库可以做到,但是没有运气: ”‘“).map(_.getValuesMapAny)).collect().foreach(println); 返回以下内容: topic =’‘’Ulmus_minor _’‘Toledo’‘’^在

  • 我不敢相信我问这个但是... 如何使用Scala在SPARK SQL中转义SQL查询字符串? 我累了所有的东西,到处找。我以为apache commons库可以做到这一点,但运气不好: 返回以下内容: 帮个忙就好了。 j

  • 问题内容: 这是我的绳子 此处,消息包含单引号,与JSON中使用的引号相同。我要做的是从用户输入(例如消息)中填充一个字符串。因此,我需要避免那些破坏代码的特殊情况。但是,除了字符串替换之外,还有什么方法可以使它们转义,但仍允许HTML将其处理回正确的消息? 问题答案: 根据规范,JSON字符串必须用双引号引起来,因此您无需逸出。 如果必须在JSON字符串中使用特殊字符,则可以使用characte