表对应关系:
活动事件表,活动轨迹点记录表。前者与后者属于一对多关系。
需求:
当删除活动事件时,级联删除活动轨迹点的所有相关记录。
代码:
service层代码:
/**
* 删除活动轨迹
* @param id
*/
public void delete(java.lang.String id){
Page page = new Page();
page.setIsPage(false);
page.addParam("trailId", id);
List<RmTraildetail> rmTraildetails = rmTraildetailMapper.findByConditionPage(page);
rmTraildetailMapper.batchDelete(rmTraildetails);
rmActivetrailMapper.delete(id);
}
myBatis配置:
<!-- 批量删除 -->
<delete id="batchDelete" parameterType="List">
<foreach item="item" index="index" collection="list" open="begin" close=";end;" separator =";">
delete from <include refid="db_scheme"/>.VT_RM_TRAILDETAIL
<where>
ID = #{item.id,jdbcType=VARCHAR}
</where>
</foreach>
</delete>
报错信息:
org.springframework.jdbc.BadSqlGrammarException:
### Error updating database. Cause: java.sql.SQLException: ORA-06550: 第 1 行, 第 7 列:
PLS-00103: 出现符号 ";"在需要下列之一时:
( begin case declare exit for
goto if loop mod null pragma raise return select update while
with <an identifier> <a double-quoted delimited-identifier>
<a bind variable> << continue close current delete fetch lock
insert open rollback savepoint set sql execute commit forall
merge pipe purge
符号 "exit" 被替换为 ";" 后继续。
### The error may involve com.ego.volunteer.mapper.RmTraildetailMapper.batchDelete-Inline
### The error occurred while setting parameters
### Cause: java.sql.SQLException: ORA-06550: 第 1 行, 第 7 列:
PLS-00103: 出现符号 ";"在需要下列之一时:
( begin case declare exit for
goto if loop mod null pragma raise return select update while
with <an identifier> <a double-quoted delimited-identifier>
<a bind variable> << continue close current delete fetch lock
insert open rollback savepoint set sql execute commit forall
merge pipe purge
符号 "exit" 被替换为 ";" 后继续。
; bad SQL grammar []; nested exception is java.sql.SQLException: ORA-06550: 第 1 行, 第 7 列:
PLS-00103: 出现符号 ";"在需要下列之一时:
( begin case declare exit for
goto if loop mod null pragma raise return select update while
with <an identifier> <a double-quoted delimited-identifier>
<a bind variable> << continue close current delete fetch lock
insert open rollback savepoint set sql execute commit forall
merge pipe purge
符号 "exit" 被替换为 ";" 后继续。
研究框架生成的sql发现问题所在:
==> Executing: begin ;end;
[2017-10-24 16:51:53,238] MCHVOLUNTEER :DEBUG
==> Parameters:
原来是当活动轨迹对应的轨迹点没有数据时,就会生成数据项为空的sql,导致报数据库执行异常。
解决方案:
对获得的数据集合进行判空处理即可。
相关代码:
/**
* 删除活动轨迹
* @param id
*/
public void delete(java.lang.String id){
Page page = new Page();
page.setIsPage(false);
page.addParam("trailId", id);
List<RmTraildetail> rmTraildetails = rmTraildetailMapper.findByConditionPage(page);
if (rmTraildetails!=null && rmTraildetails.size()>0) {
rmTraildetailMapper.batchDelete(rmTraildetails);
}
rmActivetrailMapper.delete(id);
}