公司开发项目中,出现一个错误,找了一下午,才找到一个类似的错误,现在记录一下。
报错信息:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'pd.username != null and pd.username != '''. Cause: org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, "username")
分析原因:
公司开发项目,是用一个项目框架来开发的,其中没有针对每个数据表建立实体类,而是直接创建PageData类型(继承HashMap并实现了Map接口),由此类来代替所有的实体类。
框架使用SSM。
当客户端请求Controller,我会通过new PageData()创建PageData()对象,将前端JSP传到Controller中方法的参数进行保存。由于mapper.xml映射文件中,时常会需要传递输入参数类型和输出参数类型,因此是直接传递PageData类型的参数。但此时在mapper.xml映射文件中不能使用pd.属性名来获取参数了,因此mybatis会直接用它封装的方法,return一个map。如下:
错误写法:
<select id="findUserByUsername" parameterType="pd" resultType="pd">
SELECT
*
FROM
user
<where>
<if test="pd.username != null and pd.username != ''">
AND user.username = #{pd.username}
</if>
</where>
</select>
正确写法:把pd去掉即可
<select id="findUserByUsername" parameterType="pd" resultType="pd">
SELECT
*
FROM
user
<where>
<if test="username != null and username != ''">
AND user.username = #{username}
</if>
</where>
</select>