模糊查詢使用占位符出現(xiàn)問題
public?class?ListServlet?extends?HttpServlet{ ????@Override ????protected?void?doGet(HttpServletRequest?req,?HttpServletResponse?resp) ????????????throws?ServletException,?IOException?{ ????????//?TODO?Auto-generated?method?stub ????????try?{ ????????????req.setCharacterEncoding("UTF-8"); ????????????//首先不管是不是第一次查看列表頁面,先得到查詢條件 ????????????String?command=(String)?req.getParameter("command"); ????????????String?description=(String)?req.getParameter("description"); ????????????req.setAttribute("command",?command); ????????????req.setAttribute("description",?description); ????????????Connection?connection=ConnectionDB.getConnection(); ????????????StringBuilder?sql=new?StringBuilder("select?ID,COMMAND,DESCRIPTION,CONTENT?from?message?where?1=1"); ????????????//判斷得到的參數(shù)是不是空,還有是不是空字符串,把條件存放在集合中,因?yàn)槭褂昧苏嘉环逻呉M(jìn)行賦值 ????????????List<String>?list=new?ArrayList<String>(); ????????????if(command!=null?&&?!command.trim().equals("")){ ????????????????sql.append("?and?COMMAND?=??"); //????????????????sql.append("?and?COMMAND?=?"+command); ????????????????list.add(command); ????????????} ????????????if(description!=null?&&?!description.trim().equals("")){ ????????????????sql.append("?and?DESCRIPTION?like?'%'?'%'"); //????????????????sql.append("?and?DESCRIPTION?like?'%"+description+"%'"); ????????????????list.add(description); ????????????} //????????????System.out.println(sql); ????????????PreparedStatement?statement=connection.prepareStatement(sql.toString()); ????????????for(int?i=0;i<list.size();i++){ ????????????????statement.setNString(i+1,list.get(i)); ????????????} ????????????ResultSet?rs=statement.executeQuery(); ????????????List<Message>?messages=new?ArrayList<Message>(); ????????????while(rs.next()){ ????????????????Message?message=new?Message(); ????????????????message.setId(rs.getInt("ID")); ????????????????message.setCommand(rs.getString("COMMAND")); ????????????????message.setDescription(rs.getString("DESCRIPTION")); ????????????????message.setContent(rs.getString("CONTENT")); ????????????????messages.add(message); ????????????} ????????????//跳轉(zhuǎn)界面 ????????????req.setAttribute("messageList",?messages); ????????????req.getRequestDispatcher("/WEB-INF/jsp/list.jsp").forward(req,?resp); ????????}?catch?(SQLException?e)?{ ????????????//?TODO?Auto-generated?catch?block ????????????e.printStackTrace(); ????????} ????}
不明白為什么這樣使用占位符會報(bào)錯(cuò)!?。。。?/p>
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
?? ?at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
?? ?at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
?? ?at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
?? ?at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
?? ?at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3729)
?? ?at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3713)
?? ?at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:4553)
?? ?at com.mysql.jdbc.PreparedStatement.setNString(PreparedStatement.java:5262)
?? ?at com.company.servlet.ListServlet.doGet(ListServlet.java:55)
?? ?at com.company.servlet.ListServlet.doPost(ListServlet.java:80)
?? ?at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
?? ?at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
?? ?at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
?? ?at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
?? ?at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
?? ?at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
?? ?at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
?? ?at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
?? ?at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
?? ?at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
?? ?at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
?? ?at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
?? ?at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
?? ?at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
?? ?at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:442)
?? ?at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1083)
?? ?at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:640)
?? ?at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
?? ?at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
?? ?at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
?? ?at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
?? ?at java.lang.Thread.run(Thread.java:745)
我也換了其他的方式,但是就是一直報(bào)這個(gè)錯(cuò)誤,我也是服了,我感覺我沒有什么問題的呀?。。?!
2017-11-08
你第二個(gè)問號很明顯是中文字符吧
2017-07-07
在使用占位符進(jìn)行模糊查詢時(shí)不能把問號放在引號里面,問號的位置必須跟字段名同級;
因此要實(shí)現(xiàn)的話把("?and?DESCRIPTION?like?'%'?'%'")改為("?and?DESCRIPTION?like ?"),在賦值的時(shí)候給定通配符就好了;
statement.setNString(i+1,"%"+list.get(i)+"%");這樣就能實(shí)現(xiàn)了。
2016-12-10
31行,是setString(), ? 不是NString
2016-11-18
??? 要不你試試 把你24行的漢字的問號改成英語半角的?
2016-11-15
? ? ? ? ? ??if(description!=null?&&?!description.trim().equals("")){
????????????????sql.append("?and?DESCRIPTION?like?'%'?'%'");
//????????????????sql.append("?and?DESCRIPTION?like?'%"+description+"%'");
????????????????list.add(description);
????????????}
寫成like '%?%'試試?
http://381234609.iteye.com/blog/1063251