2017-04-24 61 views
4

是否可以使用Google Cloud Spanner Java SDK绑定到提供给查询IN部分的参数?如何绑定到云端Spanner Java API中的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'") 
  • 注意额外的报价。任何想法如何我们可以做到这一点没有%的字符串替换,以避免注入攻击?
+0

当你说“是错误的”,什么是错误?你在做'.bind(“names”)。toStringArray(names)' –

+0

嗨Dan,我收到这个错误: INVALID_ARGUMENT:没有运算符IN的匹配签名,用于参数类型STRING和{ARRAY } [at 1:35] SELECT name FROM customers WHERE name IN(@names) – user3707

+0

如果你的SQL语句为'WHERE name IN UNNEST(@names)' –

回答

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因为我们将有约束力的阵列,而不是重复的值。

其次是将to更改为toStringArray以按照最初尝试的方式绑定阵列。你绑定

为了更好地观察这一点,基本上阵列是这样的:

SELECT * FROM people WHERE name IN UNNEST(["Alice", "Bob"])