需求场景
我需要批量list写入数据到info_notice表格,写入的数据中有一个属性是来之user_info表格。我用foreach去写批量插入,但是在服务层我又不想根据批量写入的数据list去查询每一个nick_name,这样太费时间,效率低下,就想着在写入的时候使用查询去查找我需要nick_name。
我跳进去的坑
我的服务层,xml语句看目录解决方式
public void handle(String auId, String arId, String title) {
List<Subscription> subscriptions = subscriptionService.querySubscribe(auId);
List<InfoNotice> insertList = new ArrayList<>();
Date date = new Date();
// 构建通知信息并写入
if (CollectionUtils.isEmpty(subscriptions)){
return;
}
for (Subscription subscription : subscriptions) {
XXX xxx = new XXX();
// ... 操作
insertList.add(xxx);
}
if (insertList.size() < 0){
return;
}
this.insertInfoNoticeList(insertList);
}
subscriptions 一开始查询出来的信息是空的,而且我又没判空。
导致直接进行循环操作,insert的时候valus没有数据,就一直报错 ')'解析失败
,我以为是我的sql有问题,卡了很久
解决方式
方法一
xml里面,直接用(select)
查询出来写入
<insert id="insertInfoNoticeList">
INSERT INTO Info_notice (id,be_notified,article_id,author_id,nick_name,title,create_time,modified_time) VALUES
<foreach collection="infoNoticeList" item="info" >
(#{info.id},
#{info.beNotified},
#{info.articleId},
#{info.authorId} ,
(SELECT user_info.nick_name FROM user_info WHERE author_id=#{info.authorId}) ,
#{info.title},
#{info.createTime},
#{info.modifiedTime})
</foreach>
</insert>
方法二
我长考这个博客
模仿写出了下面的sql语句
<insert id="insertInfoNoticeList">
INSERT INTO Info_notice (id,be_notified,article_id,author_id,nick_name,title,create_time,modified_time)
SELECT A.* from(
<foreach collection="infoNoticeList" item="info" index="index" separator="union all">
SELECT
#{info.id} id,
#{info.beNotified} be_notified,
#{info.articleId} article_id,
#{info.authorId} author_id,
user_info.nick_name,
#{info.title} title,
#{info.createTime} create_time,
#{info.modifiedTime} modified_time
FROM user_info WHERE author_id=#{info.authorId}
</foreach>
) A
</insert>
这种写法用于id是使用序列去生成的,看我参考的那个博客就能懂
重点(也不是)
判空很重要
排除坑记录,有用点赞!