Java动态生成SQL查询-ATHENA

Java动态生成SQL查询-ATHENA,java,sql,Java,Sql,我正在尝试根据用户输入生成sql查询。UI上有4个搜索字段: 名、姓、科目、分数 根据用户输入,我计划生成SQL查询。输入可以是任何组合 例如:从表中选择*,其中FIRST\u NAME=“some\u value” 当给出FIRST_NAME且其他字段为空时,需要生成此查询 从FIRST_NAME=“some_value”和LAST_NAME=“some_value”所在的表中选择* 当给出FIRST_NAME和LAST_NAME且其他字段为空时,需要生成此查询 由于有4个输入字段,因此可以生

我正在尝试根据用户输入生成sql查询。UI上有4个搜索字段: 名、姓、科目、分数

根据用户输入,我计划生成SQL查询。输入可以是任何组合

例如:
从表中选择*,其中FIRST\u NAME=“some\u value”

当给出FIRST_NAME且其他字段为空时,需要生成此查询

从FIRST_NAME=“some_value”和LAST_NAME=“some_value”所在的表中选择*

当给出FIRST_NAME和LAST_NAME且其他字段为空时,需要生成此查询

由于有4个输入字段,因此可以生成的可能查询数为24(4的阶乘)

一个想法是为所有24种情况编写if条件

Java伪代码:

String QUERY = "select * from TABLE where ";

if (FIRST_NAME!=null) {

    QUERY = QUERY + "FIRST_NAME='use_input_value';"

}
if (LAST_NAME!=null) {

    QUERY = QUERY + "LAST_NAME='use_input_value';"

}
if (SUBJECT!=null) {

    QUERY = QUERY + "SUBJECT='use_input_value';"

}
if (MARKS!=null) {

    QUERY = QUERY + "MARKS='use_input_value';"

}
我不知道如何为多个输入值生成带有和编码条件的SQL查询。 我已经了解了有关动态生成sql查询的概念,但无法进一步处理

有人能帮我吗


仅供参考:我已经完成了,仍然无法根据用户输入生成查询字符串。

让我们考虑一下,如果您只运行您编写的代码,并且同时提供了
名字和
姓氏
,将会发生什么。您将得到以下结果:

select * from TABLE where FIRST_NAME='use_input_value';LAST_NAME='use_input_value';
这里有两个问题:

  • 该查询在语法上不正确
  • 它包含文本
    “使用\u输入\u值”
    ,而不是您想要的值
  • 要解决第一个问题,让我们首先在每个表达式的开头添加
    ,并删除分号,如下所示:

    String QUERY = "select * from TABLE where";
    if (FIRST_NAME!=null) {
        QUERY = QUERY + " and FIRST_NAME='use_input_value'";
    }
    
    select * from TABLE where and FIRST_NAME='use_input_value' and LAST_NAME='use_input_value'
    
    注意
    前面的空格。我们还可以删除
    where
    后面的空格

    现在,同时具有FIRST_NAME和LAST_NAME的查询将如下所示:

    String QUERY = "select * from TABLE where";
    if (FIRST_NAME!=null) {
        QUERY = QUERY + " and FIRST_NAME='use_input_value'";
    }
    
    select * from TABLE where and FIRST_NAME='use_input_value' and LAST_NAME='use_input_value'
    
    更好,但现在有一个额外的
    。我们可以通过在查询开始处添加一个虚拟的always true条件来解决这个问题:

    String QUERY = "select * from TABLE where 1=1";
    
    然后,在计算完所有条件后,我们添加了一个分号,我们得到了一个有效的查询:

    select * from TABLE where 1=1 and FIRST_NAME='use_input_value' and LAST_NAME='use_input_value';
    
    (可能不需要附加分号。大多数数据库不需要在这样一个查询的末尾加分号。)

    关于字符串文本。您应该添加一个占位符,同时将要使用的值添加到
    列表中

    String QUERY = "select * from TABLE where";
    List<String> args = new ArrayList<>();
    if (FIRST_NAME!=null) {
        QUERY = QUERY + " and FIRST_NAME=?";
        args.add(FIRST_NAME);
    }
    
    由于某些原因,列和参数在JDBCAPI中从1开始索引,因此我们必须将1添加到
    i
    以生成参数索引


    然后执行
    PreparedStatement

    ,感谢您的详细解释。是否有一种方法可以构建字符串而不是使用PreparedStatement?同样在字符串文字部分string QUERY=“select*from TABLE where”;使用。你能解释一下为什么不在这里使用吗。因为我是ATHENA(AWS服务,基于PRESTO)来查询,所以我不能使用准备好的语句。我认为我应该选择选项1(1=1条件)。如果有更好的方法,请向我推荐。再次感谢您在此场景(不支持prepareStatement)中的详细解释,我认为我应该使用字符串格式来生成sql查询如果
    FIRST_NAME
    等是用户输入,则由于以下原因,您不希望将其直接附加到字符串中。这就是为什么您通常使用带有占位符的
    PreparedStatement
    ,以允许JDBC为您正确地转义或清理输入。