# SQL语法错误修复 ## 🐛 问题描述 **错误信息**: ``` 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 '-50' at line 1 ``` **错误原因**: 分页计算导致OFFSET为负数(-50) ## 🔧 修复内容 ### 1. 修复Service层分页计算 ✅ **文件**: `SysChatMessageServiceImpl.java` **问题**: 分页计算可能产生负数 **修复**: 添加负数检查,确保offset >= 0 ```java // 修复前 Integer offset = pageNum != null && pageSize != null ? (pageNum - 1) * pageSize : null; // 修复后 Integer offset = null; if (pageNum != null && pageSize != null && pageNum > 0) { offset = (pageNum - 1) * pageSize; if (offset < 0) offset = 0; } ``` ### 2. 修复Controller层重复计算 ✅ **文件**: `ChatController.java` **问题**: Controller和Service都做了分页计算,导致双重计算 **修复**: 移除Controller中的重复计算 ```java // 修复前 List list = chatMessageService.selectConversationMessages(conversationId, (pageNum - 1) * pageSize, pageSize); // 修复后 List list = chatMessageService.selectConversationMessages(conversationId, pageNum, pageSize); ``` ### 3. 修复SQL查询条件 ✅ **文件**: `SysChatMessageMapper.xml` **问题**: 没有验证分页参数的有效性 **修复**: 添加参数验证条件 ```xml LIMIT #{pageSize} OFFSET #{pageNum} LIMIT #{pageSize} OFFSET #{pageNum} ``` ## 🎯 修复结果 ### ✅ 预期行为 - 页码1,页大小50 → OFFSET 0, LIMIT 50 - 页码2,页大小50 → OFFSET 50, LIMIT 50 - 无分页参数 → 不使用LIMIT子句 ### 🚀 测试验证 1. **重启后端应用** 2. **访问消息页面** 3. **点击会话** - 应该正常显示消息列表 4. **发送消息** - 应该正常发送和显示 ## 📋 相关文件修改清单 - [x] `SysChatMessageServiceImpl.java` - 分页计算逻辑 - [x] `ChatController.java` - 移除重复计算 - [x] `SysChatMessageMapper.xml` - SQL条件验证 ## 🐛 如果问题仍然存在 ### 检查步骤 1. 确认后端应用已重启 2. 检查浏览器控制台错误 3. 查看后端日志详细信息 4. 验证数据库连接正常 ### 调试SQL ```sql -- 手动测试查询 SELECT message_id, conversation_id, sender_id, sender_name, content, create_time FROM sys_chat_message WHERE conversation_id = 'conv_1_2' AND status != '0' ORDER BY create_time ASC LIMIT 50 OFFSET 0; ``` --- **状态**: 🟢 已修复 **更新时间**: 2025-11-12 22:42