【问题标题】:How to avoid quotes around values in jOOQ如何避免 jOOQ 中值的引号
【发布时间】:2018-11-07 20:35:23
【问题描述】:

我使用 jOOQ 作为 SQL 构建器,并尝试构建一个简单的更新语句,如下所示:

DSL.using(SQLDialect.POSTGRES_9_5)
.update(table("Location"))
.set(field("speed"), 50)
.set(field("location"), "ST_PointFromText('POINT(-73 40)', 4326)")
.where(field("id").equal(1))
.getSQL(ParamType.INLINED);

如您所见,我使用的是 Postgres 和 PostGIS,所以我需要使用 PostGIS 方法 ST_PointFromText() 插入位置。

生成的 SQL 如下所示,但由于 ST_PointFromText() 被单引号括起来而失败:

update Location
set speed = 50, location = 'ST_PointFromText(''POINT(-73 40)'', 4326)' 
where id = 1

查询应该是:

update Location
set speed = 50, location = ST_PointFromText('POINT(-73 40)', 4326)
where id = 1

有什么方法可以去掉 ST_PointFromText() 周围的引号?

【问题讨论】:

    标签: java sql postgresql postgis jooq


    【解决方案1】:

    当你在 jOOQ 中写这样的东西时:

    .set(field("location"), "ST_PointFromText('POINT(-73 40)', 4326)")
    

    然后,放在右侧的值将被视为绑定值。如果您生成带有内联绑定值的 SQL,它会变成转​​义字符串文字。一般来说,您会想要那个,因为这是正确且预期的行为,因为您将值传递给语句(否则想象一下,SQL 注入的风险等)

    如果您确实想在查询中添加一些“普通 SQL”字符串,只需使用 DSL.field(String),例如

    .set(field("location", String.class), 
         field("ST_PointFromText('POINT(-73 40)', 4326)", String.class))
    

    Note that the data types are required because of this issue。我刚刚把String.class 作为一个虚拟类型。您可能应该为您的 POINT 数据类型实现一个实际的 converter / binding 以保持干净。

    有关纯 SQL 和纯 SQL 模板的更多信息,请参阅手册的以下部分:

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 2022-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      相关资源
      最近更新 更多