所以在我的课程中我有:
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上抛出错误,因此设置params不是问题。我想知道这是否使用了%符号,我包含了这些符号,这样您就可以搜索而无需输入确切的用户ID,名称等。
提前感谢您的帮助!
答案 0 :(得分: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 ?
答案 1 :(得分:2)
使用CONCAT
功能,它会起作用,如下所示:LIKE CONCAT('%', ?, '%')
或者您也可以使用LIKE ('%' || ? || '%')
答案 2 :(得分:2)
您可以使用连接运算符
进行编写LIKE ('%' || ? || '%')