如何避免jOOQ中值的引号

时间:2018-05-29 08:50:46

标签: java sql postgresql postgis jooq

我使用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 个答案:

答案 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模板的更多信息,请参阅手册的以下部分: