我正在寻找一种以不同的方言生成SQL查询的方法。我发现最合适的方法是工具/库jOOQ。
调用此行代码后:
System.out.println(ctx.insertInto(DSL.table(DSL.name("table"))).set(DSL.field("id"), 1).getSQL());
我的输出有问题:
insert into table (id) values (?)
为什么有“?”而不是数字1?
我希望:
insert into table (id) values (1)
我还有一个问题,如何将SQL生成为字符串,我应该创建一个真实的数据库,以某种方式获取表的整个SQL?是否有可能获得我之前使用过/调用过的整个SQL查询,或者总是只使用getSQL()会更好?
答案 0 :(得分:3)
原因是您获得的SQL是jOOQ在将语句传递给JDBC 1
is passed as a bound value instead时实际使用的SQL。在许多情况下,这不仅在JDBC中,而且在其他类似的API中,也更加安全高效。
但是在此用例中,the documentation says
有时,您可能希望避免在仍然使用SQL中的自定义值的同时呈现绑定变量。 jOOQ将其称为“内联”绑定值。内联绑定值时,它们将在SQL中而不是JDBC问号中呈现实际值。绑定值内联可以通过以下几种方式实现:
全局,通过使用“设置”并将org.jooq.conf.StatementType设置为STATIC_STATEMENT。这将内联从这样的配置呈现的SQL语句的所有绑定值。
使用Query.getSQL(ParamType)方法在本地进行每个查询。
通过使用DSL.inline()方法在本地每个值。
对于这种特定情况,我希望仅通过查看the API即可调用getSQL(ParamType.INLINED)
而不是仅getSQL()
来工作。