Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以从preparedStatem.setString()获取字符串吗?_Java_Prepared Statement_Setstring - Fatal编程技术网

Java 我可以从preparedStatem.setString()获取字符串吗?

Java 我可以从preparedStatem.setString()获取字符串吗?,java,prepared-statement,setstring,Java,Prepared Statement,Setstring,我有一个问题-我根据用户输入选项动态创建SQL查询。因此,用户有5个参数,实际上更多,他可以选择使用其中的一些参数,如果他愿意,或者不使用,并在查询中指定它们的值。因此,我通过检查是否选择了参数以及是否提供了值来构造查询字符串基本WHERE条件。然而,现在有一个特殊字符的问题,如'。我可以尝试使用replaceAll',\ \但这很枯燥,而且我知道preparedStatement.setString做得更好。然而,对于我来说,我需要再次检查是否提供了参数,以及前一个参数是否也指定了?并将其连接

我有一个问题-我根据用户输入选项动态创建SQL查询。因此,用户有5个参数,实际上更多,他可以选择使用其中的一些参数,如果他愿意,或者不使用,并在查询中指定它们的值。因此,我通过检查是否选择了参数以及是否提供了值来构造查询字符串基本WHERE条件。然而,现在有一个特殊字符的问题,如'。我可以尝试使用replaceAll',\ \但这很枯燥,而且我知道preparedStatement.setString做得更好。然而,对于我来说,我需要再次检查是否提供了参数,以及前一个参数是否也指定了?并将其连接到正确的参数。这会导致很多组合,看起来并不优雅

所以我的问题是-我是否可以接收到preparedStatement.setString生成的字符串?或者有一个类似的函数可以做同样的工作,并给我字符串,这样我就可以手动将它放入查询中


可能介绍太长了,但有人可能有更好的想法,我想解释一下我为什么需要它。

您可以根据是否指定了参数来构造基本的、未参数化的SQL查询,然后使用准备好的语句来填充参数

它可能看起来像这样的草图:

Map<String, Object> parameterValues = /*from user*/;
List<String> parameterNames = Arrays.asList("field1", "field2", "field3");
List<Object> valueList = new ArrayList<Object>();

StringBuilder statementBuilder = new StringBuilder("select * from table where ");
for ( String parameterName : parameterNames ) {
    if ( parameterValues.containsKey(parameterName) ) {
        statementBuilder.append(parameterName + " = ? AND");
        valueList.add(parameterValues.get(parameterName));
    }
}

PreparedStatement st = conn.prepareStatement(statementBuilder.toString(), 
                       valueList);
//set each parameter here.

这只是第一次很难;然后你可以把它变成通用的。也就是说,可能有一些查询构建器为您抽象了所有这些内容。我使用QueryDSL,但它没有纯JDBC的绑定,而是JPA和JDO等。

在另一个论坛上,我得到了一种不同、更简单、更干净的方法,可以完美地工作。 以下是针对具有相同问题的其他人的一些链接:
http://www.akadia.com/services/dyn_modify_where_clause.html

我不太理解您的问题,但您绝对应该100%使用setString,而不是自己使用。请包含代码的相关部分。我认为您应该使用?包含字符,具体取决于提供的参数。获得查询字符串后,再次遍历参数,调用setString。这会起作用吗?马克-是的,我正在做非常相似的事情。问题是在事后设置参数——这是我的问题。由于参数已编号,因此需要检查是否设置了上一个参数。因此,也就是说,对于参数B,您需要检查是否设置了参数A,然后使用setString2,parB,如果不使用setString1,parB。对于参数C,您需要检查A和B,因为它可以位于位置1、2或3。这是最难的部分。这就是为什么我会像setString那样使用一些函数手动放置它们来准备值。@srd.pl:列表的要点是您不必这样做。您只需执行一个简单的for循环并增加一个索引。请注意,如果指定了值,我只将其放入valueList中,因此元素在列表中的位置就是它在准备语句中的位置。@mark peters Querydsl在Querydsl SQL模块中有JDBC的绑定。