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>
这里的关键要点:
- 关键字之间留空格:
?(也就是MyBatis的#{}参数)和后续的order by、WHERE等关键字之间必须有空格,避免数据库识别错误。 - 正确的Oracle分页嵌套结构:通过三层嵌套子查询实现分页,确保
ROWNUM的筛选逻辑正确。 - 参数绑定规范:使用
#{}来绑定参数,既可以避免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
相关产品推荐
相关产品推荐

