麻烦老师看一下sql语句哪里又出错了?

来源:5-2 项目作业

散落满天的回忆

2020-06-02 22:09:52

java.lang.reflect.InvocationTargetException

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at com.imooc.book.controller.GlobalController.service(GlobalController.java:51)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

at com.imooc.book.global.EncodingFilter.doFilter(EncodingFilter.java:24)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:528)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)

at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)

at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798)

at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)

at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:810)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)

at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)

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)

Caused by: org.apache.ibatis.exceptions.PersistenceException: 

### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where b.category_id=4 order by b.id desc) tmp_count' at line 1

### The error may exist in com/imooc/book/dao/BookDao.java (best guess)

### The error may involve com.imooc.book.dao.BookDao.select-Inline

### The error occurred while setting parameters

### SQL: select count(0) from (select b.*,ca.name as cname from book as b left join category as ca on b.category_id=ca.id order by b.id desc where b.category_id=? order by b.id desc) tmp_count

### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where b.category_id=4 order by b.id desc) tmp_count' at line 1

at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)

at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:137)

at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75)

at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)

at com.sun.proxy.$Proxy18.select(Unknown Source)

at com.imooc.book.biz.BookImp.select(BookImp.java:20)

at com.imooc.book.controller.DefaultController.index(DefaultController.java:36)

... 30 more

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where b.category_id=4 order by b.id desc) tmp_count' at line 1

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)

at com.mysql.jdbc.Util.getInstance(Util.java:408)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2487)

at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)

at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1197)

at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:63)

at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)

at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)

at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)

at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)

at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)

at com.github.pagehelper.util.ExecutorUtil.executeAutoCount(ExecutorUtil.java:138)

at com.github.pagehelper.PageInterceptor.count(PageInterceptor.java:150)

at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:97)

at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)

at com.sun.proxy.$Proxy16.query(Unknown Source)

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)

... 37 more

package com.imooc.book.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.imooc.book.biz.BookBiz;
import com.imooc.book.biz.BookImp;
import com.imooc.book.biz.CategoryBiz;
import com.imooc.book.biz.CategoryImp;
import com.imooc.book.entity.Book;
import com.imooc.book.entity.Category;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

public class DefaultController {
   //   /index.do
   public void index(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){
       //获取分类id
       String id =httpServletRequest.getParameter("id");
       int cid=0;
       if (!"".equals(id)&& null != id){
           cid=Integer.parseInt(id);
       }
       CategoryBiz categoryBiz=new CategoryImp();
       BookBiz bookBiz=new BookImp();
       List<Category> categoryList=categoryBiz.select();
       httpServletRequest.getServletContext().setAttribute("categoryList",categoryList);
           String  pageNum=httpServletRequest.getParameter("pageNum");
           if (pageNum==null){
               pageNum="1";
           }
           PageHelper.startPage(Integer.parseInt(pageNum),5);
           List<Book> list = bookBiz.select(cid);
           PageInfo pageInfo=PageInfo.of(list);

           httpServletRequest.setAttribute("pageInfo",pageInfo);
           try {
               httpServletRequest.getRequestDispatcher("/WEB-INF/page/admin/index.jsp").forward(httpServletRequest,httpServletResponse);
           } catch (ServletException e) {
               e.printStackTrace();
           } catch (IOException e) {
               e.printStackTrace();
           }


   }
}
package com.imooc.book.dao;

import com.imooc.book.entity.Book;
import com.imooc.book.entity.Category;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface BookDao {
   @Insert("<script>"
           +"insert into book(id,category_id,name,level,price,img_path,create_time,update_time) values"+
           "<foreach collection='list' item='list' separator=','>" +
           "(null,#{list.categoryId},#{list.name},#{list.level},#{list.price},#{list.imgPath},#{list.createTime},#{list.updateTime})"+
           "</foreach>"+
           "</script>")
   @Options(useGeneratedKeys = true,keyProperty = "id")
   void batchInsert(List<Book> list);//批量添加商品
   @Delete("delete from book where id=#{id}")
   void delete(int id);
   @Select("<script>"+
           "select b.*,ca.name as cname from book as b left join category as ca on b.category_id=ca.id order by b.id desc"
           +"<if test='id !=0'>"
           +"where b.category_id=#{id}"
           +"</if>"

           +"order by b.id desc"
           +"</script>"

            )
   @Results(id="all",value = {
           @Result(column = "id",property = "id",id = true),
           @Result(column = "category_id",property = "categoryId"),
           @Result(column = "name",property = "name"),
           @Result(column = "level",property = "level"),
           @Result(column = "price",property = "price"),
           @Result(column = "img_path",property = "imgPath"),
           @Result(column ="create_time",property = "createTime"),
           @Result(column = "update_time",property = "updateTime"),
           @Result(column = "cname",property = "category.name")
   })
   List<Book> select(@Param(value="id")int id);//查询所有图书
   @Select("select b.*,ca.name as cname from book as b left join category as ca on b.category_id=ca.id  where b.category_id=#{id}")
   @ResultMap("all")
   List<Book> selectByid(int id);//根据图书分类id查询图书
}

写回答

1回答

好帮手慕阿满

2020-06-03

同学你好,报错提示如下:

http://img.mukewang.com/climg/5ed711cd09bca05c09770617.jpg

提示错误可能发生在BookDao.java类中,select语句错误,错误发生在设置参数时,SQL就是指报错的具体sql语句。

Order By是排序,必须在where条件后,在where条件前使用就会报错。

http://img.mukewang.com/climg/5ed713ae09a8686209130431.jpg

祝:学习愉快~

0

0 学习 · 8016 问题

查看课程