You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MyBatis多参数传递失败及ORA-00936语法错误求助

解决MyBatis查询中的ORA-00936语法错误及参数传递问题

我帮你分析下问题所在,你遇到的ORA-00936: 缺少表达式错误,核心是MyBatis生成的SQL存在语法问题,同时可能伴随参数绑定的小问题,我们一步步来解决:

首先看报错的SQL片段问题

你提供的报错SQL片段:

……WHERE LECTUREKEY = ?order by topicdate desc) a) bwhere rn between ? and ?

这里有几个明显的语法错误:

  • ?order 处缺少空格:WHERE LECTUREKEY = ? 之后直接跟order by,数据库会把?order当成一个无法识别的表达式,这是触发ORA-00936的直接原因。
  • 括号不匹配且关键字拼写错误:) a) bwhere 这里多了一个闭合括号,而且bwhere应该是WHERE,属于笔误或者拼接错误。
  • Oracle的rownum分页结构不正确,正确的嵌套子查询格式才符合Oracle的分页逻辑。

正确的Oracle分页SQL写法(结合MyBatis)

针对你的场景,正确的MyBatis XML查询语句应该是这样的(假设你的表名是lecture_table,实体是Lecture):

<select id="queryLecturesWithPagination" resultType="com.yourpackage.Lecture">
    SELECT * FROM (
        SELECT t.*, ROWNUM rn FROM (
            SELECT * 
            FROM lecture_table
            WHERE LECTUREKEY = #{lectureKey}
            ORDER BY topicdate DESC
        ) t 
        WHERE ROWNUM <= #{paginationCriteria.end}
    ) 
    WHERE rn >= #{paginationCriteria.start}
</select>

这里的关键要点:

  1. 关键字之间留空格:?(也就是MyBatis的#{}参数)和后续的order by、WHERE等关键字之间必须有空格,避免数据库识别错误。
  2. 正确的Oracle分页嵌套结构:通过三层嵌套子查询实现分页,确保ROWNUM的筛选逻辑正确。
  3. 参数绑定规范:使用#{}来绑定参数,既可以避免SQL注入,也能让MyBatis正确解析参数对象的属性(比如paginationCriteria.start)。

检查Mapper接口的参数定义

确保你的Mapper接口方法正确声明了参数,比如如果需要传递lectureKey和PaginationCriteria两个参数,要使用@Param注解来明确参数名:

import org.apache.ibatis.annotations.Param;
import java.util.List;

public interface LectureMapper {
    List<Lecture> queryLecturesWithPagination(
        @Param("lectureKey") String lectureKey,
        @Param("paginationCriteria") PaginationCriteria paginationCriteria
    );
}

这样MyBatis才能在XML中正确识别#{lectureKey}、#{paginationCriteria.start}和#{paginationCriteria.end}这些参数引用。

验证生成的SQL

可以开启MyBatis的日志功能,查看最终生成的SQL语句,确认参数是否正确替换、语法是否无误。在mybatis-config.xml中添加日志配置:

<settings>
    <!-- 打印SQL日志到控制台 -->
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

执行查询后,控制台会输出完整的SQL语句和参数值,你可以直接把SQL拿到Oracle客户端执行,验证语法是否正确。

按照上面的步骤调整后,应该就能解决ORA-00936的错误,同时确保PaginationCriteria的start和end参数正常传递。

内容的提问来源于stack exchange,提问作者sakai masato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:34:16