2017-04-24 59 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"])