我仍然需要我的桌子名称是动态的。我正在构建一个简单的服务:我在列表中有很多桌子名称(未引用),我需要循环浏览它们,然后在某个地方写下计数。
当然,我可以在其他Q&A中使用这些技术(例如jdbctemplate动态表名称和SQLInjoction
)将表名称输入其中,但它可能包含任何在标识符中有效的字符。
SELECT COUNT(*) FROM <database>.<schema>.<table>
,foo
,foo"bar
等。它们最初是从
foo; DROP TABLE Students
中获取的。数据库和架构名称更可预测,甚至可能不需要引用,但仍然如此。唯一正确引用它们的方法是语句的
INFORMATION_SCHEMA
,但是我正在使用JDBCTEMPLATE,它不容易暴露出来。我能找到的最好的方法是使用使用准备的stattatementCreator的JDBCTEMPLATE方法之一,因此我可以从连接开始,获取语句,使用我可以引用标识符;然后将其扔掉,从连接中构建准备准备。我还没有测试过,但是使用似乎很尴尬。
有更好,更简单的方法吗?我喜欢Jooq,但是将其添加为实际上只是一个
enquoteIdentifier
的依赖性似乎过于杀伤。
(*)“正确”,这意味着我不必编写一种逃脱引号,逃脱逃脱字符并将标识符包裹在引号中的方法。实际上,增强识别仪甚至知道会议的逃生角色吗?我将假设它设置为默认值,并且驱动程序知道默认值。
the statement是根据连接创建的,尽管您可以查看JDBCTEMPLATE的来源并重新创建此问题,但您可能不想走那个低级别。 我认为Pgstatement不覆盖
SELECT COUNT(*)
的默认语句实现,因此我的建议只是将
source从
enquoteIdentifier
复制到您自己的项目: