如何在PreparedStatement中填充WHERE IN参数

时间:2014-09-29 17:35:44

标签: java prepared-statement where-in

这是我的疑问。

String SELECT_USERS_FROM_GROUPS = "select * from user where group_id in ?";

我需要从列表中的组中选择用户:

例如,列表可以是。

long[] groupIdList = { 1, 2 };

这是我的代码:

public List<User> getUsersFromGroups(long[] groupIdList) {

        ResultSet rs = null;
        PreparedStatement statement = null;
        Connection connection = null;
        List<User> userList = null;
        User user;

        try {

            connection = Connector.getConnection();
            statement = connection.prepareStatement(SELECT_USERS_FROM_GROUPS);

            Array groupIdArray = connection.createArrayOf("LONG", groupIdList);
            statement.setArray(1, groupIdArray);

            rs = statement.executeQuery();

            userList = new ArrayList<User>();
            while (rs.next()) {
                user = new User();    
                user = fillUser(rs);    
                userList.add(user);
            }

        } catch (SQLException e) {
            logger.error(e.getMessage(), e);
        } finally {
            ResourcesUtil.release(rs, statement, connection);
        }

        return userList;

    }

但是我尝试了一个例外行:Array groupIdArray = connection.createArrayOf("LONG", groupIdList);

有人可以帮助我纠正错误,或指导另一种可能的解决方案。 谢谢你;

- 编辑

例外:

ERROR UserDao:138 - 
java.sql.SQLFeatureNotSupportedException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at com.mysql.jdbc.SQLError.notImplemented(SQLError.java:1350)
    at com.mysql.jdbc.JDBC4Connection.createArrayOf(JDBC4Connection.java:55)
    at com.mchange.v2.c3p0.impl.NewProxyConnection.createArrayOf(NewProxyConnection.java:589)
    at com.thehuxley.data.dao.UserDao.getUsersFromGroups(UserDao.java:120)

2 个答案:

答案 0 :(得分:1)

JDBC预处理语句仅支持具有已知数量参数的IN子句,每个值必须在原始查询中表示:

select * from user where group_id in (?, ?)

使用statement.setXXX方法设置参数与任何其他参数一样。如果需要可变数量的参数,则必须动态生成查询字符串(在IN子句中提供正确的?)。

另请参阅:PreparedStatement IN clause alternatives?

答案 1 :(得分:0)

在以下情况下抛出SQLFeatureNotSupportedException

  

JDBC驱动程序不支持此数据类型

所以看起来您的数据库不支持"LONG"数据类型。