我使用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()周围的引号?
答案 0 :(得分:2)
当你在jOOQ中写这样的东西时:
.set(field("location"), "ST_PointFromText('POINT(-73 40)', 4326)")
然后,右侧的值将被视为绑定值。如果您生成带有内联绑定值的SQL,它将变为转义字符串文字。通常,您将想要,因为它是正确的和预期的行为,因为您将值传递给语句(想象一下,SQL注入的风险等)< / p>
如果你想添加一些&#34;普通SQL&#34;字符串到您的查询,只需使用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实际的https://www.jooq.org/doc/latest/manual/sql-building/plain-sql/。
有关纯SQL和纯SQL模板的更多信息,请参阅手册的以下部分: