在Mybatis中,传入的参数实体结构是:
@Data
public class AlarmSignalConditionDTO {
private Integer alarmGrade;
private Integer acsId;
private Integer objectId;
private Map<String,IntervalTimeDTO> intervalTimeMap;
}
而IntervalTimeDTO的结构是:
@Data
public class IntervalTimeDTO {
private String startTime;
private String endTime;
public IntervalTimeDTO() {
}
public IntervalTimeDTO(String startTime, String endTime) {
this.startTime = startTime;
this.endTime = endTime;
}
}
需求是需要遍历map并且将IntervalTimeDTO中的属性值作用在指定的表字段上作为查询条件。Mybatis的xml中的sql语句如下:
<select id="getCountAlarmSignalByCondition" parameterType="AlarmSignalConditionDTO" resultType="Integer">
SELECT count(*) FROM (
<foreach collection="intervalTimeMap.keys" item="key" separator=" union all ">
SELECT * FROM(
SELECT * FROM t_external_entrance_alarm_signal
WHERE
<![CDATA[
occur_time >= #{intervalTimeMap[${key}].startTime}
AND occur_time < #{intervalTimeMap[${key}].endTime}
]]>
and alarm_grade = #{alarmGrade}
and acs_id = #{acsId}
and entrance_id = #{objectId}
)${key}
</foreach>
)t
</select>
这里实际是遍历map的key,然后需要读取IntervalTimeDTO的时候,按照key:value的方式:
intervalTimeMap[
k
e
y
]
.
e
n
d
T
i
m
e
这
样
读
取
,
此
时
需
要
注
意
的
是
读
取
k
e
y
的
时
候
需
要
使
用
“
{key}].endTime这样读取,此时需要注意的是读取key的时候需要使用“
key].endTime这样读取,此时需要注意的是读取key的时候需要使用“”,在一个是如果key是Integer类型,那么可能会再读取属性值时会失败。具体解决方式还没有找到。