版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33624952/article/details/81867475
一、做需求遇到的问题:
callOutSubTask中包括callOutTask的对象,当页面展示的时候没有输入,callOutSubTask为null,可以得到所有的callOutSubTask列表的数据,当输入日期,而不输入taskName是不能显示数据,原因出在Mapper.xml中。
类callOutTask
public class CallOutTask extends DataEntity<CallOutTask> {
private Office office;
private String taskName;
private String taskDesc;
private Integer taskSize;
private Integer completedSize;
// 0 已分配 1 已完成
private Integer status;
// 不入库,只是供存储字段使用
private String seatList; // 选取座席字段
private String searchCondition; // 分配座席时客户的选择条件
/* 用于查询,数据库没有字段 */
private Date beginCreateDate;
private Date endCreateDate;
public Date getBeginCreateDate() {
return beginCreateDate;
}
public void setBeginCreateDate(Date beginCreateDate) {
this.beginCreateDate = beginCreateDate;
}
public Date getEndCreateDate() {
return endCreateDate;
}
public void setEndCreateDate(Date endCreateDate) {
this.endCreateDate = endCreateDate;
}
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public String getTaskDesc() {
return taskDesc;
}
public void setTaskDesc(String taskDesc) {
this.taskDesc = taskDesc;
}
public Integer getTaskSize() {
return taskSize;
}
public void setTaskSize(Integer taskSize) {
this.taskSize = taskSize;
}
public Integer getCompletedSize() {
return completedSize;
}
public void setCompletedSize(Integer completedSize) {
this.completedSize = completedSize;
}
public String getSeatList() {
return seatList;
}
public void setSeatList(String seatList) {
this.seatList = seatList;
}
public String getSearchCondition() {
return searchCondition;
}
public void setSearchCondition(String searchCondition) {
this.searchCondition = searchCondition;
}
public Office getOffice() {
return office;
}
public void setOffice(Office office) {
this.office = office;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
/**
* 判断taskName是否为空
* @return
*/
public Boolean isTaskNameNotNull(){
return StringUtils.isNotEmpty(this.taskName);
}
}
类callOutSubTask
public class CallOutSubTask extends DataEntity<CallOutSubTask> {
private String taskId;
private String executorId;
private Integer subTaskNum;
private Integer completedNum;
private CallOutTask task;
private User user; //执行人关联对应id
private Integer status;
/* 用于查询,数据库没有字段 */
private Date beginCreateDate;
private Date endCreateDate;
public Date getBeginCreateDate() {
return beginCreateDate;
}
public void setBeginCreateDate(Date beginCreateDate) {
this.beginCreateDate = beginCreateDate;
}
public Date getEndCreateDate() {
return endCreateDate;
}
public void setEndCreateDate(Date endCreateDate) {
this.endCreateDate = endCreateDate;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public CallOutTask getTask() {
return task;
}
public void setTask(CallOutTask task) {
this.task = task;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getTaskId() {
return taskId;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
public String getExecutorId() {
return executorId;
}
public void setExecutorId(String executorId) {
this.executorId = executorId;
}
public Integer getSubTaskNum() {
return subTaskNum;
}
public void setSubTaskNum(Integer subTaskNum) {
this.subTaskNum = subTaskNum;
}
public Integer getCompletedNum() {
return completedNum;
}
public void setCompletedNum(Integer completedNum) {
this.completedNum = completedNum;
}
}
二、问题的解决:
1、在类CallOutSubTask中添加方法
/**
* 判断taskName是否为空
* @return
*/
public Boolean isTaskNameNotNull(){
return StringUtils.isNotEmpty(this.taskName);
}
2、配置mapper.xml
<choose>
<when test="task != null and task != ''">
<if test="task.isTaskNameIsNull()">
AND b.taskName= #{task.taskName}
</if>
</when>
</choose>
这样满足了两种需求,以及配置中解决了不能出现task.taskNamel来进行判断
三、额外收获:
在xml当中对于日期的判断尽量不要用bettween来进行配置
会出现日期当中的数据查不出来的bug
再则,在配置xml当中会产生>与<不能书写的情况,这就需要其他方式了
AND a.create_date >= #{beginCreateDate}
AND a.create_date <= #{endCreateDate}
四、动态的,根据不同情况查询调用可以解决
五、动态传表和,连接表的数据
两个重要点:
1.用${tableName}而非#{tableName}
2.防止预编译 statementType=”STATEMENT”
public List<MergeChannel> getMergeChannelList(@Param("tableName") String tableName,@Param("mode") Integer mode);
<select id="getMergeChannelList" resultType="MergeChannel" statementType="STATEMENT">
<choose>
<when test="mode==0">
SELECT
<include refid="mergeChannelSingleColumns"/>
FROM `salecule`.${tableName} a
<include refid="mergeChannelSingleChannelJoins"/>
</when>
<otherwise>
SELECT
<include refid="mergeChannelDoubleColumns"/>
FROM `salecule`.${tableName} b
<include refid="mergeChannelDoubleChannelJoins"/>
</otherwise>
</choose>
</select>