如何避免在 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