多字段查询问题
Mybatis 自动生成的代码不支持多字段的模糊查询,并且同时查询其他内容,
单个字段的模糊查询可以通过原有方法andXXXlike:Criteria.andNameLike(value);
1.查询结构
Select * from t_table where a=? and concat(‘’,’’,’’) like concat(‘’)
该查询语句中需要通过and连接 ,但是连接的内容为多个字段的模糊查询
2.添加结构
方式1
修改方法均为BeanCriteria方法中方法:
该方法利用自动生成工具生成的typeHandle属性,添加方法:
/**
* 多字段查询
* @param condition
* @param value1模糊查询,查询字段
* @param value2
* @param property
*/
protected void addCriterion(String condition, Object value1, Object value2, String property,String typeHandle) {
if (value1 == null || value2 == null) {
throw new RuntimeException("Contact values for " + property + " cannot be null");
}
criteria.add(new Criterion(condition, value1, value2,typeHandle));
}
修改构造函数,主要变更是添加typeHandler 的使用:
/**
* 模糊查询
* @param condition
* @param value
* @param secondValue
* @param typeHandler contact仅支持多字段,不支持单字段
*/
protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
super();
this.condition = condition;
this.value = value;
this.secondValue = secondValue;
this.typeHandler = typeHandler;
if (null == typeHandler || "".equals(typeHandler)) {
this.betweenValue = true;
}else{//多字段模糊查询
this.listValue = true;
}
}
添加模糊查询方法
/**
* 模糊查询Criteria 添加方法
* @param columnIds
* @param searchText
* @return
*/
public Criteria andConcatListLike(List<String> columnIds,String searchText) {
// AND CONCAT(`VALUE_CODE`, `NAME`) LIKE CONCAT('%',#{searchParam},'%')
addCriterion("Concat", columnIds,searchText, columnIds.toString(),"concat");
return (Criteria) this;
}
XML文件更改:<sql id="Example_Where_Clause">
中部分修改
<when test="criterion.listValue">
<if test="criterion.typeHandler == 'concat'">
and CONCAT
<foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
${listItem}
</foreach>
LIKE CONCAT('%',#{criterion.secondValue},'%')
</if>
<if test="criterion.typeHandler!='concat'">
and ${criterion.condition}
<foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
#{listItem}
</foreach>
</if>
</when>
方式2
and与or的联合使用
BeanCriteria totalExample=new BeanCriteria();
Criteria test = totalExample.createCriteria();
test.andNameLike(text);
Criteria ortest = totalExample.createCriteria();
ortest.andIpLike(text);
totalExample.or(ortest);
${}与#{}区别
注意事项:${}不会做特殊处理,#{}会将参数处理为字符串