2010-11-06 17 views
0

我對包含大量客戶數據的數據庫運行此MySQL查詢。查詢是巨大的,所以我會剪掉部分。我們使用的是5.1.45-51-log的Percona SQL Server,它是一個非常常見的MySQL版本。MySQL查詢在我的應用程序中失敗,但在MySQL命令行工具中成功

select distinct * " + 
       "from customer_contact_preferences prefs " + 
... 
       "join re_account_attribute uaa on uaa.account_id = ua.id " + 
       "where ... " + 
... 
       "and uaa.attribute_key = 'R_GROUP' " + 
       //"and uaa.attribute_value in (?) " + //PROBLEM HERE 
       "order by customer_contact_id)" 

uaa.attribute值的參數是'1','2',3'。

在代碼中,我們使用org.springframework.jdbc.core.simple.SimpleJDBCDaoSupport.update()來調用此查詢。 通過Spring在代碼中調用它時,它錯誤地返回0行。當我替換參數(4人檢查了我替換權),並在mysql命令行上運行時,查詢正確返回> 5行。如果我註釋掉問題行,就像我在上面做的那樣,我會得到> 5,實際上行數太多(這就是爲什麼我需要這個約束)。

該表描述如下:

| attribute_key  | varchar(255)  | NO |  | NULL |    | 
| attribute_value | varchar(255)  | NO |  | NULL |    | 

據,所以我們可以存儲任何類型的鍵/值對,並不限於VARCHAR或整數。

無論如何,當你有一個字符串或字符串列表時,「IN」有什麼問題?謝謝。

回答

1

參數IN子句支持只有在使用命名參數,而不是?年春JDBC模板,見12.7.3 Passing in lists of values for IN clause。所以,你需要

getSimpleJdbcTemplate().update("... IN (:params) ...", 
    Collections.singletonMap("params", ...)); 
+0

謝謝,我剛剛實現了這一點,它的工作。 – 2010-11-08 17:04:15

1

您不能將列表或數組綁定到'?'。

您必須創建一個'?'對於List中的每個項目或SQL中的數組,然後單獨綁定每個項目。

List<String> values = Arrays.asList(new String [] { "foo", "bar", "baz" }); 
StringBuilder sql = new StringBuilder(); 
sql.append("SELECT * FROM X WHERE ID IN ("); 
for (int i = 0; i < values.length; ++i) 
{ 
    sql.append('?'); 
    if (i != values.length-1)) 
     sql.append(','); 
} 
sql.append(")"); 
PreparedStatement ps = connection.prepareStatement(sql.toString()); 
for (int i = 0; i < values.length; ++i) 
{ 
    ps.setString(i+1, values[i]); 
} 
ResultSet rs = ps.executeQuery(); 
+0

感謝這是很好的信息。我需要一個彈簧兼容的方式,請參閱下面的解 – 2010-11-06 17:48:35

相關問題