4

是否可以使用 Google Cloud Spanner Java SDK 绑定到提供给查询 IN 部分的参数?

例如

List<String> names = new ArrayList<String>();
names.add("Alice");
names.add("Bob");
String sql = "SELECT * FROM people WHERE name IN (@names)";
Statement statement = Statement
                .newBuilder(sql)
                .bind("names").to(names)
                .build();

如果我们使用 toStringArray 绑定名称,则会出错。如果我们设置以下内容:

names = "'Alice','Bob'";

那么生成的SQL是:

SELECT * FROM people WHERE name IN ("'Alice','Bob'")
  • 注意额外的引号。知道我们如何在没有%s 字符串替换的情况下做到这一点以避免注入攻击吗?
4

1 回答 1

4

对您的代码进行 2 处更改:

List<String> names = new ArrayList<String>();
names.add("Alice");
names.add("Bob");
String sql = "SELECT * FROM people WHERE name IN UNNEST(@names)";
Statement statement = Statement
                .newBuilder(sql)
                .bind("names").toStringArray(names)
                .build();

首先是设置条件IN UNNEST,因为我们将绑定一个数组而不是重复值。

其次是更改totoStringArray您最初尝试的绑定数组。

为了更好地可视化这一点,您绑定的数组本质上是这样的:

SELECT * FROM people WHERE name IN UNNEST(["Alice", "Bob"])
于 2017-04-24T16:19:02.440 回答