package org.catframework.agileworking.domain; import java.util.Date; import java.util.List; import java.util.stream.Collectors; import javax.persistence.EntityManager; import javax.transaction.Transactional; import org.catframework.agileworking.vo.ScheduleVO; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.transform.Transformers; import org.springframework.beans.factory.annotation.Autowired; public class ScheduleRepositoryImpl implements ScheduleRepositoryCustom { @Autowired private EntityManager entityManager; /** * 自定义 native query 查询 {@link ScheduleVO} ,略繁琐但是好像没有更好的办法. */ @Transactional @Override public List<ScheduleVO> findByOpenIdAndDate(String openId, Date date) { String sql = "select t.schedule_id as scheduleId ,t.date,t.meeting_room_id as meetingRoomId,t.title,t.open_id as openId,m.room_no as roomNo,t.start_time as startTime,t.end_time as endTime, t.repeat_mode as repeatMode from (select p.schedule_id,p.date,s.meeting_room_id,s.title,p.open_id,s.start_time,s.end_time,s.repeat_mode from participant p left join schedule s on p.schedule_id = s.id ) as t left join meeting_room m on t.meeting_room_id = m.id where (t.open_id=? and t.date=?) or (t.open_id=? and repeat_mode='W')"; Session session = entityManager.unwrap(org.hibernate.Session.class); SQLQuery query = session.createSQLQuery(sql); @SuppressWarnings("unchecked") List<ScheduleVO> scheduleVOs = query.setResultTransformer(Transformers.aliasToBean(ScheduleVO.class)) .setParameter(0, openId).setParameter(1, date).setParameter(2, openId).list(); return scheduleVOs.stream().filter(s -> s.isNeedInclude(date)).map(s -> { s.setDate(date); return s; }).sorted().collect(Collectors.toList()); } @Transactional @Override public List<ScheduleVO> findByDate(Date date) { String sql = "select t.schedule_id as scheduleId ,t.date,t.meeting_room_id as meetingRoomId,t.title,t.open_id as openId,m.room_no as roomNo,t.start_time as startTime,t.end_time as endTime, t.repeat_mode as repeatMode from (select p.schedule_id,p.date,s.meeting_room_id,s.title, s.creator_open_id open_id,s.start_time,s.end_time,s.repeat_mode from participant p left join schedule s on p.schedule_id = s.id ) as t left join meeting_room m on t.meeting_room_id = m.id where (t.date=?) or (repeat_mode='W')"; Session session = entityManager.unwrap(org.hibernate.Session.class); SQLQuery query = session.createSQLQuery(sql); @SuppressWarnings("unchecked") List<ScheduleVO> scheduleVOs = query.setResultTransformer(Transformers.aliasToBean(ScheduleVO.class)) .setParameter(0, date).list(); return scheduleVOs.stream().filter(s -> s.isNeedInclude(date)).map(s -> { s.setDate(date); return s; }).sorted().collect(Collectors.toList()); } public void setEntityManager(EntityManager entityManager) { this.entityManager = entityManager; } }