Spring MySQL查询在我的应用程序中失败,但在MySQL命令行工具中成功
我正在对包含大量客户数据的数据库运行这个MySQL查询。这个查询是巨大的,所以我将删除部分。我们使用的是5.1.45-51-log Percona SQL Server,它是MySQL的一个非常常见的版本Spring MySQL查询在我的应用程序中失败,但在MySQL命令行工具中成功,spring,mysql,jdbc,Spring,Mysql,Jdbc,我正在对包含大量客户数据的数据库运行这个MySQL查询。这个查询是巨大的,所以我将删除部分。我们使用的是5.1.45-51-log Percona SQL Server,它是MySQL的一个非常常见的版本 select distinct * " + "from customer_contact_preferences prefs " + ... "join re_account_attribute uaa on uaa.account
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行。当我替换args(4个人检查了我的替换是否正确)并在mysql命令行上运行它时,查询正确地返回>5行。如果我注释掉问题行,就像我在上面做的那样,我会得到>5行,实际上行太多(这就是为什么我需要这个约束)
该表描述如下:
| attribute_key | varchar(255) | NO | | NULL | |
| attribute_value | varchar(255) | NO | | NULL | |
这样我们就可以存储任何类型的键/值对,而不限于varchar或int
不管怎样,当您有一个字符串或字符串列表时,“IN”有什么错?谢谢。您不能将列表或数组绑定到“?” 必须为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();
List values=Arrays.asList(新字符串[]{“foo”、“bar”、“baz”});
StringBuilder sql=新的StringBuilder();
append(“从X中选择*,其中ID位于(”);
对于(int i=0;i 只有在使用命名参数而不是?
时,Spring JDBC模板才支持中的参数化,
子句,请参阅。所以,你需要
getSimpleJdbcTemplate().update("... IN (:params) ...",
Collections.singletonMap("params", ...));
谢谢,这是很好的信息。我需要一种与spring兼容的方式,请参阅下面的解决方案。