package com.yeshi.buwan.service.imp; import com.yeshi.buwan.dao.VideoResourceMapExtraInfoDao; import com.yeshi.buwan.domain.VideoInfo; import com.yeshi.buwan.domain.VideoResourceMapExtraInfo; import com.yeshi.buwan.service.inter.VideoResourceMapExtraInfoService; import org.hibernate.HibernateException; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.springframework.orm.hibernate4.HibernateCallback; import org.springframework.stereotype.Service; import org.yeshi.utils.StringUtil; import javax.annotation.Resource; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Service public class VideoResourceMapExtraInfoServiceImpl implements VideoResourceMapExtraInfoService { @Resource private VideoResourceMapExtraInfoDao videoResourceMapExtraInfoDao; @Override public Map listMap(List videoIdList, List resourceIds) { List idsList = new ArrayList<>(); if (videoIdList != null) for (String videoId : videoIdList) if (resourceIds != null) for (Long resourceId : resourceIds) { idsList.add(String.format("'%s'", new VideoResourceMapExtraInfo(videoId, resourceId).getId())); } if (idsList.size() == 0) return new HashMap<>(); List list = (List) videoResourceMapExtraInfoDao.excute(new HibernateCallback>() { @Override public List doInHibernate(Session session) throws HibernateException { String sql = "SELECT * FROM (SELECT i.* FROM `wk_video_resource_map_extra_info` i LEFT JOIN wk_video_resource r ON r.`id`=i.`resource_id` WHERE i.`id` IN (%s) ORDER BY r.`orderby` DESC ) a GROUP BY a.`video_id`"; SQLQuery query = session.createSQLQuery(String.format(sql, StringUtil.concat(idsList, ","))); List list = query.addEntity(VideoResourceMapExtraInfo.class).list(); return list; } }); Map map = new HashMap<>(); for (VideoResourceMapExtraInfo info : list) { map.put(info.getVideoId(), info); } return map; } @Override public List batchExtraInfo(List videoInfoList, List resourceIds) { List videoIdList = new ArrayList<>(); for (VideoInfo videoInfo : videoInfoList) { videoIdList.add(videoInfo.getId()); } Map map = listMap(videoIdList, resourceIds); for (VideoInfo videoInfo : videoInfoList) { videoInfo.setVideoResourceMapExtraInfo(map.get(videoInfo.getId())); if (videoInfo.getVideoResourceMapExtraInfo() != null) videoInfo.setFree(videoInfo.getVideoResourceMapExtraInfo().getFree()); } return videoInfoList; } }