【问题标题】:String Utils join in not working as expected字符串实用程序加入未按预期工作
【发布时间】:2023-04-05 05:51:01
【问题描述】:

我有一个从列表 A 中的查询返回的字符串列表。

我正在尝试使用 String Utils.join 将列表中的值组合为以逗号和引号分隔的字符串。但它没有按预期工作。

abcList 中的值 - [abc, cde, fgh]

abcList.addAll(jdbcTemplate.queryForList(abcSql, String.class));
String abc= StringUtils.join(abcList, "','");
abc = "'" +abc+ "'";

预期输出 - 'abc'、'cde'、'fgh'
实际输出 - 'abc, cde, fgh'

我不确定我在这里做错了什么,因为我想将字符串 abc 中的值传递给带有“IN”条件的查询。

【问题讨论】:

  • 您使用的是哪个StringUtils
  • 在我的电脑上按预期工作。您使用的是哪个版本的 StringUtils?
  • 使用lang3 3.7 版按预期工作
  • 使用此导入导入 org.apache.commons.lang3.StringUtils 和 jar 版本 3.1
  • 为什么不直接使用查询abcSql 本身作为IN 子句中的子查询,而不是获取实际的字符串?

标签: java list apache-stringutils string-utils


【解决方案1】:

你也可以使用stream.Collectors.joining

List<String> myList = Arrays.asList("abc","def","ghi");
String joined = myList.stream().collect(Collectors.joining("','", "'", "'"));
System.out.println(joined);

【讨论】:

    【解决方案2】:

    如果您使用的是 Java 8,则可以使用本机方法来连接字符串。

    List<String> list = <get a list of strings somehow>;
    String joinedString = String.join("','", list);
    

    See the String.join javadoc

    作为 JDBC 查询的提示...您应该使用命名参数在查询中插入值,而不是手动构造查询字符串。

    有关示例,请参阅this SO 帖子。

    【讨论】:

    • 太糟糕了,@Erithrean 的回答也不起作用。不过,无论如何,您都应该使用命名参数进行查询(请参阅我的编辑)。如果您这样做,您将不必手动添加引号。
    • 但是这些值,然后在 IN 子句中使用,来自另一个查询。OP 应该将该查询直接用作子查询,而不是执行它,获取结果并将其注入另一个查询。
    • @DodgyCodeException 是的,我绝对同意应该这样做。但我认为仍然值得澄清关于如何在查询中设置参数的误解,因为它在其他情况下与安全相关。
    猜你喜欢
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多