Просмотр исходного кода

修复jpql distinct 导致响应缓慢

luojing 5 лет назад
Родитель
Сommit
b42865a343

+ 29 - 26
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceDetailFactory.java

@@ -3,6 +3,7 @@ package com.x.attendance.assemble.control.factory;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
@@ -284,8 +285,10 @@ public class AttendanceDetailFactory extends AbstractFactory {
 			}
 		}
 		
-		cq.distinct(true).select( root.get( AttendanceDetail_.empName ) );
-		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+		/*cq.distinct(true).select( root.get( AttendanceDetail_.empName ) );
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();*/
+		cq.select( root.get( AttendanceDetail_.empName ) ).where(p);
+		return em.createQuery(cq).setMaxResults(20000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	/**
@@ -344,8 +347,8 @@ public class AttendanceDetailFactory extends AbstractFactory {
 			}
 		}
 		
-		cq.distinct(true).select( root.get( AttendanceDetail_.empName ) );
-		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+		cq.select( root.get( AttendanceDetail_.empName ) ).where(p);
+		return em.createQuery(cq).setMaxResults(20000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	//@MethodDescribe("按指定的开始时间,结束时间列示未被分析的AttendanceDetail信息列表")
@@ -433,11 +436,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
-		cq.distinct(true).select( root.get(AttendanceDetail_.unitName ));
+		cq.select( root.get(AttendanceDetail_.unitName ));
 		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.yearString), year ));
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.monthString), month ));
-		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	/**
@@ -482,11 +485,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
-		cq.distinct(true).select( root.get(AttendanceDetail_.unitName ));
+		cq.select( root.get(AttendanceDetail_.unitName ));
 		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), cycleYear ));
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
-		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	//@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的顶层组织名称列表")
@@ -498,11 +501,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
-		cq.distinct(true).select( root.get(AttendanceDetail_.topUnitName ));
+		cq.select( root.get(AttendanceDetail_.topUnitName ));
 		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.yearString), year ));
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.monthString), month ));
-		return em.createQuery(cq.where(p)).setMaxResults(1000).getResultList();
+		return em.createQuery(cq.where(p)).setMaxResults(1000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	//@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的员工姓名列表")
@@ -514,11 +517,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
-		cq.distinct(true).select( root.get(AttendanceDetail_.empName ));
+		cq.select( root.get(AttendanceDetail_.empName ));
 		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), cycleYear ));
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
-		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	//@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的顶层组织名称列表")
@@ -530,11 +533,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
-		cq.distinct(true).select( root.get(AttendanceDetail_.topUnitName ));
+		cq.select( root.get(AttendanceDetail_.topUnitName ));
 		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), cycleYear ));
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
-		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	//@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的组织名称列表")
@@ -546,11 +549,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
-		cq.distinct(true).select( root.get(AttendanceDetail_.unitName ));
+		cq.select( root.get(AttendanceDetail_.unitName ));
 		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), cycleYear ));
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
-		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	//@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的组织名称列表")
@@ -562,12 +565,12 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
-		cq.distinct(true).select( root.get(AttendanceDetail_.unitName ));
+		cq.select( root.get(AttendanceDetail_.unitName ));
 		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), cycleYear ));
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.empName), employeeName ));
-		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 
@@ -580,10 +583,10 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
-		cq.distinct(true).select( root.get(AttendanceDetail_.id ));
+		cq.select( root.get(AttendanceDetail_.id ));
 		//一般始终为true, id is not null
 		Predicate p = cb.equal( root.get(AttendanceDetail_.batchName), file_id );
-		return em.createQuery(cq.where(p)).getResultList();
+		return em.createQuery(cq.where(p)).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	//@MethodDescribe("按年份月份查询某用户的打卡数据记录列表")
@@ -1304,9 +1307,9 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		List<Selection<?>> selectionList = new ArrayList<Selection<?>>();
 		selectionList.add(root.get(AttendanceDetail_.cycleYear ));
 		selectionList.add(root.get(AttendanceDetail_.cycleMonth ));
-		cq.distinct(true).multiselect(selectionList);
+		cq.multiselect(selectionList);
 		
-		return em.createQuery(cq.where(p)).getResultList();
+		return em.createQuery(cq.where(p)).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	public List<AttendanceCycles> getCyclesFromDetailWithDateSplit( String empName, Date startDate, Date endDate )  throws Exception{
@@ -1322,9 +1325,9 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		List<Selection<?>> selectionList = new ArrayList<Selection<?>>();
 		selectionList.add(root.get(AttendanceDetail_.cycleYear ));
 		selectionList.add(root.get(AttendanceDetail_.cycleMonth ));
-		cq.distinct(true).multiselect(selectionList);
+		cq.multiselect(selectionList);
 		
-		return em.createQuery(cq.where(p)).getResultList();
+		return em.createQuery(cq.where(p)).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	//@MethodDescribe("查询未归档的条卡记录列表,最大2000条")
@@ -1409,7 +1412,7 @@ public class AttendanceDetailFactory extends AbstractFactory {
 			);
 			p = cb.and( p, p_or );
 		}
-		cq.distinct(true).select(root.get(AttendanceDetail_.empName));
-		return em.createQuery(cq.where(p)).setMaxResults(100000).getResultList();
+		cq.select(root.get(AttendanceDetail_.empName));
+		return em.createQuery(cq.where(p)).setMaxResults(100000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 }

+ 5 - 4
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/DingdingAttendanceFactory.java

@@ -15,6 +15,7 @@ import javax.persistence.metamodel.SingularAttribute;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class DingdingAttendanceFactory extends AbstractFactory {
 
@@ -315,8 +316,8 @@ public class DingdingAttendanceFactory extends AbstractFactory {
         CriteriaQuery<String> query = cb.createQuery(String.class);
         Root<AttendanceDingtalkDetail> root = query.from(AttendanceDingtalkDetail.class);
         Predicate p = cb.between(root.get(AttendanceDingtalkDetail_.userCheckTime), startTime.getTime(), endTime.getTime());
-        query.select(root.get(AttendanceDingtalkDetail_.o2Unit)).where(p).distinct(true);
-        return em.createQuery(query).getResultList();
+        query.select(root.get(AttendanceDingtalkDetail_.o2Unit)).where(p);
+        return em.createQuery(query).getResultList().stream().distinct().collect(Collectors.toList());
     }
 
 
@@ -608,8 +609,8 @@ public class DingdingAttendanceFactory extends AbstractFactory {
         CriteriaQuery<String> query = cb.createQuery(String.class);
         Root<AttendanceQywxDetail> root = query.from(AttendanceQywxDetail.class);
         Predicate p = cb.between(root.get(AttendanceQywxDetail_.checkin_time_date), startTime, endTime);
-        query.select(root.get(AttendanceQywxDetail_.o2Unit)).where(p).distinct(true);
-        return em.createQuery(query).getResultList();
+        query.select(root.get(AttendanceQywxDetail_.o2Unit)).where(p);
+        return em.createQuery(query).getResultList().stream().distinct().collect(Collectors.toList());
     }
 
     /**