如何绑定到 Cloud Spanner 中的 IN 参数 Java API
How to bind to IN parameters in Cloud Spanner Java API
是否可以使用 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 字符串替换的情况下避免注入攻击吗?
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
,因为我们将绑定数组而不是重复值。
其次是将 to
更改为 toStringArray
以像您最初尝试的那样绑定数组。
为了更好地形象化,您绑定的数组本质上是这样的:
SELECT * FROM people WHERE name IN UNNEST(["Alice", "Bob"])
是否可以使用 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 字符串替换的情况下避免注入攻击吗?
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
,因为我们将绑定数组而不是重复值。
其次是将 to
更改为 toStringArray
以像您最初尝试的那样绑定数组。
为了更好地形象化,您绑定的数组本质上是这样的:
SELECT * FROM people WHERE name IN UNNEST(["Alice", "Bob"])