如何在另一个准备好的语句中使用 PreparedStatement 作为子查询

Posted

技术标签:

【中文标题】如何在另一个准备好的语句中使用 PreparedStatement 作为子查询【英文标题】:How to use a PreparedStatement as a subquery in another prepared statement 【发布时间】:2016-09-13 16:15:03 【问题描述】:

我在代码中使用PreparedStatement 进行查询。例如:

PreparedStatement stmt = db.con.prepareStatement("select id from nodes where x>? and x<? and y>? and y<?");           
stmt.setDouble(1, x1); 
... //set a value for each param 1 thru 4

现在我有另一个查询想要使用与上面完全相同的查询作为子查询。所以我可以这样做:

PreparedStatement stmt2 = db.con.prepareStatement("select id from edges where startNodeId in 
(select id from nodes where x>? and x<? and y>? and y<?)");

但这是重复的,我可能会修改第一个 PreparedStatement 并希望这些更改传播到第二个。有没有办法将准备好的语句设置为另一个语句中的子查询?

也许类似于stmt2.setPreparedStatement(2, stmt)

【问题讨论】:

不行。但是没有什么能阻止您在查询文本中重用字符串常量。你甚至可以编写一个辅助方法来设置 4 个参数。 正如@Andreas 所说,为了清楚起见,也许使用命名参数以便您可以正确引用它们? @KoosGadellaa PreparedStatement 不支持命名参数,仅支持位置参数。 你是对的。再次迷失在Springlation中 【参考方案1】:

只需将两个查询组合成一个SELECT 语句。

SELECT x,y,z FROM tablez WHERE id IN (SELECT id FROM "your first query")

【讨论】:

以上是关于如何在另一个准备好的语句中使用 PreparedStatement 作为子查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MySQL 准备好的语句缓存?

如何在 Android sqlite 中使用准备好的语句? [复制]

如何查看准备好的语句的内容?

如何在 CodeIgniter 中使用准备好的语句

如何在 Java 中使用准备好的语句进行选择查询?

如何在 MySQLI 中使用准备好的语句?