SQL-ERROR-FIX.md 2.7 KB

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

// 修复前
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中的重复计算

// 修复前
List<SysChatMessage> list = chatMessageService.selectConversationMessages(conversationId, 
    (pageNum - 1) * pageSize, pageSize);

// 修复后
List<SysChatMessage> list = chatMessageService.selectConversationMessages(conversationId, pageNum, pageSize);

3. 修复SQL查询条件 ✅

文件: SysChatMessageMapper.xml 问题: 没有验证分页参数的有效性 修复: 添加参数验证条件

<!-- 修复前 -->
<if test="pageNum != null and pageSize != null">
    LIMIT #{pageSize} OFFSET #{pageNum}
</if>

<!-- 修复后 -->
<if test="pageNum != null and pageSize != null and pageNum >= 0 and pageSize > 0">
    LIMIT #{pageSize} OFFSET #{pageNum}
</if>

🎯 修复结果

✅ 预期行为

  • 页码1,页大小50 → OFFSET 0, LIMIT 50
  • 页码2,页大小50 → OFFSET 50, LIMIT 50
  • 无分页参数 → 不使用LIMIT子句

🚀 测试验证

  1. 重启后端应用
  2. 访问消息页面
  3. 点击会话 - 应该正常显示消息列表
  4. 发送消息 - 应该正常发送和显示

📋 相关文件修改清单

  • SysChatMessageServiceImpl.java - 分页计算逻辑
  • ChatController.java - 移除重复计算
  • SysChatMessageMapper.xml - SQL条件验证

🐛 如果问题仍然存在

检查步骤

  1. 确认后端应用已重启
  2. 检查浏览器控制台错误
  3. 查看后端日志详细信息
  4. 验证数据库连接正常

调试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