亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

模糊查詢使用占位符出現問題

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");
????????????//判斷得到的參數是不是空,還有是不是空字符串,把條件存放在集合中,因為使用了占位符,下邊要進行賦值
????????????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);
????????????}
????????????//跳轉界面
????????????req.setAttribute("messageList",?messages);
????????????req.getRequestDispatcher("/WEB-INF/jsp/list.jsp").forward(req,?resp);
????????}?catch?(SQLException?e)?{
????????????//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????}
????}

不明白為什么這樣使用占位符會報錯?。。。?!

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)

我也換了其他的方式,但是就是一直報這個錯誤,我也是服了,我感覺我沒有什么問題的呀?。。?!

正在回答

5 回答

你第二個問號很明顯是中文字符吧

0 回復 有任何疑惑可以回復我~

在使用占位符進行模糊查詢時不能把問號放在引號里面,問號的位置必須跟字段名同級;

因此要實現的話把("?and?DESCRIPTION?like?'%'?'%'")改為("?and?DESCRIPTION?like ?"),在賦值的時候給定通配符就好了;

statement.setNString(i+1,"%"+list.get(i)+"%");這樣就能實現了。

0 回復 有任何疑惑可以回復我~

31行,是setString(), ? 不是NString

0 回復 有任何疑惑可以回復我~
#1

sakura_fc 提問者

我試過setString,后來才改成setNString的,不可以。
2016-12-12 回復 有任何疑惑可以回復我~

??? 要不你試試 把你24行的漢字的問號改成英語半角的?

0 回復 有任何疑惑可以回復我~

? ? ? ? ? ??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

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

模糊查詢使用占位符出現問題

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號