Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring MySQL查询在我的应用程序中失败,但在MySQL命令行工具中成功_Spring_Mysql_Jdbc - Fatal编程技术网

Spring MySQL查询在我的应用程序中失败,但在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

我正在对包含大量客户数据的数据库运行这个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_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兼容的方式,请参阅下面的解决方案。