如何摆脱Java中的尾随AND

时间:2018-04-20 14:14:39

标签: java sql

这是一个愚蠢的问题,但是如何在Java中删除sql语句中的尾随AND?

我根据我提供的Profile对象动态生成语句。因此,如果对象具有“name = person1”和“address = example road”,则该语句应为:

select * from Profile where name = 'person1' and address = 'example road'

问题在于我使用for循环遍历对象的声明字段,因此它在末尾添加了一个AND:

select * from Profile where name = 'person1' and address = 'example road' and

什么是摆脱尾随AND的最好方法?

3 个答案:

答案 0 :(得分:1)

有些人会简单地修剪最后的"和#34;从结果字符串的末尾开始,但通常最好避免编写最终字符串。

如果你的循环看起来像这样:

for (String sqlCondition : sqlConditionsList) {
    sqlStatement.append(sqlCondition).append(" and ");
}

然后我建议将其更改为:

boolean separatorNeeded = false;
for (String sqlCondition : sqlConditionsList) {
    if (separatorNeede) {
        sqlStatement.append(" and ");
    }
    sqlStatement.append(sqlCondition);
    separatorNeeded = true;
}

这只会添加"和"实际需要的分隔符,在你正在迭代的列表中的连续项之间。

答案 1 :(得分:1)

您应该使用准备好的声明。构建这样的查询会让您对SQL注入和其他攻击持开放态度。

如果您必须继续使用当前的方法,那么快速解决方法是通过正则表达式剥离最终的AND

String sql = "select * from Profile where name = 'person1' and address = 'example road' and";
sql = sql.replaceAll("(?i)\\s+and$", "");

DB Fiddle Demo

答案 2 :(得分:0)

您应该使用预准备语句或ORM。但是如果你仍然希望以这种容易出错的方式做到这一点,你可以这样做:

public static void main(String args[]) {
    String[] params = new String[3];

    params[0] = "x = y";
    params[1] = "z = a";
    params[2] = "b = d";

    String result = String.join(" and ", params);

    System.out.println(result);

}

使用join方法比使用尾随和。

更容易解决问题