Java 将SQL和绑定数据转换为纯SQL

Java 将SQL和绑定数据转换为纯SQL,java,sql,oracle,jdbc,Java,Sql,Oracle,Jdbc,我有一个定制的Java查询引擎,它可以生成一个SQL字符串,使用?作为数据占位符和包含要绑定到占位符的数据的对象列表。然后将其传递给JDBCTemplate.queryForListsql、bindings.toArray API以生成结果集 这很好,但我还需要在子查询中使用此SQL,并且无法找到一种简单的方法,通过在Java类型和数据库友好格式之间进行适当的数据库转换,将此SQL转换为直接SQL 是否有实用程序可以执行此操作?您可能需要查看以下实用程序。 虽然这不会直接回答您的问题,但在将来

我有一个定制的Java查询引擎,它可以生成一个SQL字符串,使用?作为数据占位符和包含要绑定到占位符的数据的对象列表。然后将其传递给JDBCTemplate.queryForListsql、bindings.toArray API以生成结果集

这很好,但我还需要在子查询中使用此SQL,并且无法找到一种简单的方法,通过在Java类型和数据库友好格式之间进行适当的数据库转换,将此SQL转换为直接SQL


是否有实用程序可以执行此操作?

您可能需要查看以下实用程序。

虽然这不会直接回答您的问题,但在将来可能会很有用。我也遇到过这个问题,我设计了一种适合我的方法,尽管不是最好的。我创建了一个方法,可以按照您的建议自动填充参数中的值,但它根本不是以类型安全的方式完成的。无论如何,如果您决定使用该方法,也许您可以采用该方法并加以改进:

public static String preparedQueryString(String staticQuery, Object... parameters) {
    for(Object curParameter : parameters) {
        if(curParameter instanceof String) {
            staticQuery = staticQuery.replaceFirst("\\?", "'" + curParameter.toString() + "'");
        } else {
            staticQuery = staticQuery.replaceFirst("\\?", curParameter.toString());
        }

    return staticQuery;
}
您可能还希望添加代码,以确保参数的数量不超过问号的数量,并且您可能还希望使java类型更适合转换为您使用的数据库。我使用它来输出PreparedStatement的SQL,因为PreparedStatement没有任何好的特性,可以让您在设置适当的参数后删除完成的SQL查询


希望这有帮助,

我不明白这个问题。所以您有一个类似这样的SQL,从id=?。您想将其用作子查询,意思是-select a.name,b.age from select name from names where id=?作为a,年龄b和a.id=b.id?我从id=?并使用整数1列出,并希望从id=1的名称中选择名称。问题是我的select stmt和List对于不同的类型非常复杂,等等。我考虑过自己进行查找/替换,但似乎很难担心类型映射……为什么要用硬编码的值替换动态sql标记?我想这就是您所说的从id=1的名称中选择名称的意思。因为我需要将其嵌入另一个SQL查询中,该查询不是预先准备好的语句格式…特别是使用iBatis+1,谢谢,这就是我想要的…我只是希望不要再发明轮子,因为我知道JDBC层已经能够在准备好的语句和SQL之间进行映射,等等…是的,yw。不幸的是,我没有找到更好的。我已经找了一段时间了。我认为PreparedStatement的一个问题是它将sql预编译为本机数据库格式,并且无论出于何种原因,在设置参数后都无法提取sql。我听说可以使用工具检查数据库以获取sql查询,但这显然不是我们想要的。