for循環里的查詢,只是為了賦值對象中的一個字段,如果每一個都重新查一下數據庫,影響效率
應該先進行查詢,然后再循環里組裝自己需要的業務數據
如下代碼:list1 查詢出對象的一部分內容,list2 查詢出對象的另一部分內容,然后在for循環里組裝這個對象。
其中關鍵點是:循環里嵌套的循環,每次遍歷完數據以后,再remove掉,注意list的remove方法
1 public List<Timetable> listTimetableByUserAndTime(Long userId, Integer userType, Date leftDate, Date rightDate) { 2 List<Lesson> list1 = courseService.listLessonByStudentIdAndTime(userId, leftDate, rightDate); 3 if (list1 == null || list1.isEmpty()) { 4 return new ArrayList<>(); 5 } 6 List<Timetable> list2 = courseService.listLessonByUserIdAndUserTypeAndLessonId(userId, userType, list1); 7 if (list2 == null) { 8 list2 = new ArrayList<>(); 9 } 10 11 List<Timetable> ansList = new ArrayList<>(); 12 for (Lesson lesson : list1) { 13 Timetable timetable = new Timetable(); 14 timetable.setUserId(userId); 15 timetable.setUserType(userType); 16 timetable.setLessonId(lesson.getId()); 17 timetable.setLessonTime(DateUtil.convertDateToLong(lesson.getStartTime())); 18 19 //循環賦值 20 if (list2.isEmpty()) { 21 timetable.setWatchState(0); 22 } else { 23 boolean flag = true; 24 for (int i = 0; i < list2.size(); i++) { 25 Timetable tmp = list2.get(i); 26 //兩個實體類的代碼進行相等比較,更好的方法是重寫equals,這里不考慮了 27 if (timetable.getUserId().equals(tmp.getUserId()) && timetable.getUserType().equals(tmp.getUserType()) && timetable.getLessonId().equals(tmp.getLessonId())) { 28 //如果相等,賦值以后,還要從list里移除,跳出循環 29 flag = false; 30 timetable.setId(tmp.getId()); 31 timetable.setWatchState(tmp.getWatchState()); 32 list2.remove(i); 33 break; 34 } 35 } 36 //沒有找到相同的實體 37 if (flag) { 38 timetable.setWatchState(0); 39 } 40 } 41 ansList.add(timetable); 42 } 43 44 return ansList; 45 }
PS:剛開始我總覺還有一種辦法,就是在使用mybatis的時候,有沒有可能,傳的參數是List對象,返回的值直接賦值到這個參數里的List對象里,這樣就最簡單了,但是搜了半天都沒有這個這個功能
原創文章,歡迎轉載,轉載請注明出處!