开发者问题收集

如何避免在 jOOQ 中使用引号

2018-05-29
1216

我正在使用 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() 周围的引号?

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))

请注意,由于此问题,数据类型是必需的 。我刚刚将 String.class 设置为虚拟类型。您可能应该为 POINT 数据类型实现实际的 转换器/绑定 ,以保持干净。

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

Lukas Eder
2018-05-29