新项目底层选择了更加灵活的Mybatis,之前用的都是自动生成工具,条件查询用的也是生成的Example,因为做统计服务,都是各种查询,也就没有加自动生成的一套。自己写Mapper.xml文件,写了个简单的条件查询接口,就遇到问题了,Parameter ‘XXX’ not found. Available parameters are [1, 0, param1, param2] .
问题出现的原因是Dao层接口定义和Mapper.xml文件中的参数类型不一致。
在Xml文件中,我定义的parameterType是查询条件的一个类,代码如下:
namespace="com.uqiauto.statistics.business.company.dao.CompanyMapper">
"BaseResultMap" type="com.uqiauto.statistics.business.company.entity.Company">
property="id" column="id" jdbcType="INTEGER" />
property="compName" column="compName" jdbcType="VARCHAR" />
<select id="queryAllCompany" resultMap="BaseResultMap" parameterType="com.uqiauto.statistics.business.company.entity.CompanyCriteria">
SELECT
compID id,
compName compName
FROM
wms_company
WHERE 1=1
<if test="keyWord!=null and keyWord!=''">
and compName like concat(concat("%",#{keyWord}),"%")
if>
<if test="platformId!=null and platformId!=''">
and PLATFORM_ID =#{platformId}
if>
<if test="companyType!=null and companyType!=''">
and COMPANY_TYPE =#{companyType}
if>
ORDER BY compID
select>
而在Dao层接口定义中,参数定义的是查询条件字段,代码如下:
List queryAllCompany(String keyWord,Long platformId,String companyType);
两者不一致,就报错了。解决方案
1)可以将Dao层方法定义的参数都加上个注解@param,代码如下:
List queryAllCompany(@Param("keyWord") String keyWord, @Param("platformId")Long platformId, @Param("companyType")String companyType);
2)可以将Dao层方法定义的参数改为Xml中定义的查询条件类,在类中定义要进行条件筛选的那几个字段,代码如下:
List<Company> queryAllCompany(CompanyCriteria companyCriteria);
@Data
public class CompanyCriteria extends Criteria {
private String keyWord;
private Long platformId;
private String companyType;
}
总结:简单的问题,因为之前用的都是自动生成的代码,很少手写,所以很多问题都没有见过,积累的过程。