当前位置: 首页 > 知识库问答 >
问题:

java - 若依项目中pageHelper分页查询报错如何解决?

韦澄邈
2024-10-07

若依pageHelper分页报错
需求:使用mybatis分页查询数据库表,以HashMap格式返回
报错信息:pageHelper获取到表总数后,查询时出了问题

16:02:03.439 [http-nio-8080-exec-1] INFO  o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring DispatcherServlet 'dispatcherServlet'
16:02:03.560 [http-nio-8080-exec-1] DEBUG c.r.p.m.D.queryDynamicTableDetails_COUNT - [debug,135] - ==>  Executing: SELECT count(0) FROM table1
16:02:03.565 [http-nio-8080-exec-1] DEBUG c.r.p.m.D.queryDynamicTableDetails_COUNT - [debug,135] - <==      Total: 1
16:02:03.566 [http-nio-8080-exec-1] DEBUG c.r.p.m.D.queryDynamicTableDetails - [debug,135] - ==>  Executing: select * from table1 LIMIT ?
16:02:03.597 [http-nio-8080-exec-1] ERROR c.r.f.w.e.GlobalExceptionHandler - [handleRuntimeException,100] - 请求地址'/project/dynamicTable/list',发生未知异常.
org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: 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 '?' at line 2
### The error may exist in file [E:\RuoYi-Vue\ruoyi-system\target\classes\mapper\project\DynamicTableMapper.xml]
### The error may involve com.ruoyi.project.mapper.DynamicTableMapper.queryDynamicTableDetails
### The error occurred while executing a query
### SQL: select * from table1  LIMIT ?
### Cause: java.sql.SQLSyntaxErrorException: 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 '?' at line 2
  • controller
@RestController
@RequestMapping("/project/dynamicTable")
public class DynamicTableController extends BaseController {
    @Autowired
    private IDynamicTableService dynamicTableService;
    @ApiOperation("获取表格信息")
    @GetMapping("/list")
    public TableDataInfo list(@RequestParam String tableName, Integer pageNum, Integer pageSize)
    {
        startPage();
        List<HashMap<String, Objects>> hashMaps = dynamicTableService.queryDynamicTableDetails(tableName);
        return getDataTable(hashMaps);
    }
}
  • iservice
public interface IDynamicTableService {
    public List<HashMap<String, Objects>> queryDynamicTableDetails(String tableName);
}
  • serviceImpl
@Service
public class DynamicTableServiceImpl implements IDynamicTableService {
    @Resource
    private DynamicTableMapper dynamicTableMapper;
    @Override
    public List<HashMap<String, Objects>> queryDynamicTableDetails(String tableName) {
        List<HashMap<String, Objects>> list = dynamicTableMapper.queryDynamicTableDetails(tableName);
        return list;
    }
}
  • mapper
public interface DynamicTableMapper {
    public List<HashMap<String, Objects>> queryDynamicTableDetails(String tableName);
}
  • mapper.xml
<mapper namespace="com.ruoyi.project.mapper.DynamicTableMapper">
    <select id="queryDynamicTableDetails" resultType="HashMap" statementType="STATEMENT">
        select * from ${tableName}
    </select>
</mapper>

如果不使用分页功能,可以正常返回数据。
尝试在serviceImpl中使用PageHelper.startPage(pageNum, pageSize)方法,还是同样的问题
求大佬指点

共有2个答案

查飞星
2024-10-07

机器人说的对着呢,statementType="STATEMENT"错了,只有prepareStatement才能预编译,你不要加这个设置项

另外你这个SQL这么写,SQL注入严重,这个接口可以查到库中所有的数据

居星阑
2024-10-07

根据你提供的错误信息和代码,问题主要出现在MyBatis的XML映射文件中,特别是在处理分页时SQL语句的构造上。由于你使用了statementType="STATEMENT",这会导致MyBatis直接解释SQL语句,而不会进行参数替换(如?),因此在使用分页时(尤其是LIMIT ?部分)会出现SQL语法错误。

解决方案

  1. 修改Mapper XML中的statementType
    statementType="STATEMENT"改为statementType="PREPARED"(或移除statementType属性,因为PREPARED是MyBatis的默认类型)。这样MyBatis就会正确处理参数替换。

    修改后的mapper.xml应该如下:

    <mapper namespace="com.ruoyi.project.mapper.DynamicTableMapper">
        <select id="queryDynamicTableDetails" resultType="HashMap" parameterType="map">
            select * from ${tableName}
            LIMIT #{offset}, #{pageSize}
        </select>
    </mapper>

    注意:这里我添加了parameterType="map",虽然你的方法签名中并未直接传递分页参数,但如果你打算在Service层调用PageHelper.startPage(pageNum, pageSize),MyBatis将能够通过分页插件自动处理offsetpageSize。不过,由于你的Mapper接口方法签名中只包含tableName,你可能需要在Service层中处理分页逻辑,并直接传递分页参数到Mapper中(如果需要的话)。

  2. 调整Service层以支持分页
    由于你的Mapper接口方法签名未包含分页参数,你可能需要在Service层中添加分页逻辑,或者修改Mapper接口以包含这些参数。但如果你使用的是PageHelper,通常不需要修改Mapper接口,因为PageHelper会在查询执行前拦截并修改SQL以添加分页参数。

    确保在Controller层调用startPage()之前传入分页参数:

    @GetMapping("/list")
    public TableDataInfo list(@RequestParam String tableName, @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum, @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<HashMap<String, Objects>> hashMaps = dynamicTableService.queryDynamicTableDetails(tableName);
        return getDataTable(hashMaps);
    }
  3. 检查MyBatis和PageHelper的配置
    确保你的项目中已经正确配置了MyBatis和PageHelper的依赖和插件。如果使用的是Spring Boot,通常可以通过在application.propertiesapplication.yml中配置PageHelper的属性来启用它。

通过以上步骤,你应该能够解决分页查询时出现的SQL语法错误问题。如果问题仍然存在,请检查你的MyBatis版本和PageHelper版本是否兼容,并查看是否有其他配置错误。

 类似资料:
  • 本文向大家介绍如何用java实现分页查询,包括了如何用java实现分页查询的使用技巧和注意事项,需要的朋友参考一下 1.基本思路 我现阶段的分页查询的实现是基于sql语句的。 构造出相应的a和b就可以查询出想要的数据,在显示在页面上。重点是要构造出当前的页数,就要封装一个javaBean,存储有关分页的基本属性。 这样只需在service层计算想要的页数,并封装基本的信息,在查询出来显示在前端就可

  • 救急,我導入的maven項目怎麽構建報錯,我自己下了jdk但是好像他構建用的不是我下載的,我又不知道怎麽更換 環境變量也設置了,但是他用的不是我下載和設置的jdk,我安裝在D盤,他用的是D盤的jdk,求大佬解答 ======== 上面的問題解決了但是還是報錯:

  • 问题内容: 改善这个问题 我正在寻找一种工具,该工具将基于对已编译字节码的静态分析,向我显示Java项目中的JAR依赖关系图。具体来说,我试图找出是否有可以消除的未使用JAR,但我也想更好地了解现有的依赖项。我没有使用Maven。 Dependency Finder 非常接近,但是它处理的是软件包而不是JAR,而且似乎没有任何方法可以查询没有依赖项的JAR。有什么建议吗?首选免费和开源。谢谢! 问

  • 我正在试图弄清楚如何为我自己的基于Scalding的项目创建文件。 滚烫源结构没有文件。相反,它具有构建定义。 将我自己的sbt项目与Scalding集成的正确方法是什么,这样我也可以稍后在Eclipse中用插件导入它? 我得到错误: 更新2 在执行和之后,我仍然有相同的编译错误。 'sbt Eclipse'创建未在Eclipse下编译的Eclipse项目,并报告以下错误:

  • 本文向大家介绍PageHelper插件实现一对多查询时的分页问题,包括了PageHelper插件实现一对多查询时的分页问题的使用技巧和注意事项,需要的朋友参考一下 项目中经常会使用到一对多的查询场景,但是PageHelper对这种嵌套查询的支持不够,如果是一对多的列表查询,返回的分页结果是不对的 参考Github上的说明:https://github.com/pagehelper/Mybatis-

  • 若依框架前端访问网关会有这么一个路径/987d0fa8c9a077cb9976.hot-update.json,求社区大佬指点一二 尝试过查找各种资料,但是都解决不了,这是和前端的热部署有关嘛,再次访问首页又没问题了