3

所以在我的程序中,我有:

    private static final String GET_USERS_BY_PARAMS = "select * from user t "
        + "where t.id like %?% "
        + "AND t.name LIKE %?% "
        + "AND t.location LIKE %?% " 
        + "AND t.telephone LIKE %?% ";

上面给出的所有参数都作为 varchar 存储在数据库中。

但是,当我运行以下命令时:

statement = connection.prepareStatement(GET_USERS_BY_SEARCH_PARAMS);
            statement.setString(1, userID);
            statement.setString(2, name);
            statement.setString(3, location);
            statement.setString(4, telephone());

            rs = statement.executeQuery();

我收到一条 SQL 异常,指出存在无效字符。应用程序在 executeQuery 上抛出错误,因此设置参数不是问题。我想知道这是否归结为使用 % 符号,我包括在内,这样您就可以搜索而无需输入确切的用户 ID、名称等。

提前感谢您的帮助!

4

3 回答 3

4

通配符必须是传递给准备好的语句的值的一部分。所以你需要这样的东西:

private static final String GET_USERS_BY_PARAMS = "select * from user t "
    + "where t.id like ? "
    + "AND t.name LIKE ? "
    + "AND t.location LIKE ? " 
    + "AND t.telephone LIKE ? ";

statement = connection.prepareStatement(GET_USERS_BY_SEARCH_PARAMS);
statement.setString(1, "%" + userID + "%");
statement.setString(2, "%" + name + "%");
statement.setString(3, "%" + location + "%");
statement.setString(4, "%" + telephone() + "%");

顺便说一句:什么数据类型是user.id

如果这是一个数值,LIKE 将无法正常工作。您可能应该明确地将 ID 转换为字符值:where to_char(t.id) like ?

于 2012-11-16T13:50:55.387 回答
2

使用CONCAT功能,它会工作,像这样:LIKE CONCAT('%', ?, '%')
或者你也可以使用LIKE ('%' || ? || '%')

于 2012-11-16T13:51:41.173 回答
2

您可以使用连接运算符编写

LIKE ('%' || ? || '%')
于 2012-11-16T13:52:07.970 回答