如何在 StringBuilder 中附加星号 *?

How to append star character * in StringBuilder?

我正在为 sql 数据库编写程序,需要根据选定的列构建 select 查询。当没有选择列时,我想使用 select * from 语法。如何将 * 附加到 StringBuilder?

ArrayList<String> columns;
StringBuilder queryBuilder = new StringBuilder("select ");

... 

if (columns == null || columns.size() == 0) {
    queryBuilder.append(Character.toString ((char) 42));
} else {
    for (String name : columns) {
        queryBuilder.append(name);
        queryBuilder.append(", ");
    }
}
queryBuilder.setLength(queryBuilder.length() - 2);
queryBuilder.append(" from ");
queryBuilder.append(tableName);

我也尝试了 ("*") ("\*") ("\*") ('*') ((char)42) 但是 none 这些工作。我从 StringBuilder 得到的输出是 select from tableName

应该这样做:

queryBuilder.append('*');

你遇到的问题是这一行:

queryBuilder.setLength(queryBuilder.length() - 2);

它会影响整个 StringBuilder 尽管它附加了单个字符或所有列名,但它应该只影响列名的串联。将此行移至此处:

} else {
    for (String name : columns) {
        queryBuilder.append(name);
        queryBuilder.append(", ");
    }
    queryBuilder.setLength(queryBuilder.length() - 2);
}
//queryBuilder.setLength(queryBuilder.length() - 2);
queryBuilder.append(" from ");
queryBuilder.append(tableName);

或者更好的是,使用类似 StringJoiner or Collectors#joining 的东西,它将为您完成 for 的工作,而不是在最后附加额外的 ", "

如果您使用的是 Java 7 或更早版本,那么我建议使用 Apache Commons 中的 StringUtils#join,它将为您执行列名称的连接。