提交 35efcd0c 编写于 作者: L luojing

修复jpql distinct 导致响应缓慢

上级 fa80acc2
...@@ -3,6 +3,7 @@ package com.x.attendance.assemble.control.factory; ...@@ -3,6 +3,7 @@ package com.x.attendance.assemble.control.factory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.Query; import javax.persistence.Query;
...@@ -284,8 +285,10 @@ public class AttendanceDetailFactory extends AbstractFactory { ...@@ -284,8 +285,10 @@ public class AttendanceDetailFactory extends AbstractFactory {
} }
} }
cq.distinct(true).select( root.get( AttendanceDetail_.empName ) ); /*cq.distinct(true).select( root.get( AttendanceDetail_.empName ) );
return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList(); 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 { ...@@ -344,8 +347,8 @@ public class AttendanceDetailFactory extends AbstractFactory {
} }
} }
cq.distinct(true).select( root.get( AttendanceDetail_.empName ) ); cq.select( root.get( AttendanceDetail_.empName ) ).where(p);
return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList(); return em.createQuery(cq).setMaxResults(20000).getResultList().stream().distinct().collect(Collectors.toList());
} }
//@MethodDescribe("按指定的开始时间,结束时间列示未被分析的AttendanceDetail信息列表") //@MethodDescribe("按指定的开始时间,结束时间列示未被分析的AttendanceDetail信息列表")
...@@ -433,11 +436,11 @@ public class AttendanceDetailFactory extends AbstractFactory { ...@@ -433,11 +436,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cq = cb.createQuery(String.class); CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<AttendanceDetail> root = cq.from( AttendanceDetail.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 ); 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_.yearString), year ));
p = cb.and(p, cb.equal( root.get(AttendanceDetail_.monthString), month )); 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 { ...@@ -482,11 +485,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cq = cb.createQuery(String.class); CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<AttendanceDetail> root = cq.from( AttendanceDetail.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 ); 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_.cycleYear), cycleYear ));
p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth )); 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信息中涉及的顶层组织名称列表") //@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的顶层组织名称列表")
...@@ -498,11 +501,11 @@ public class AttendanceDetailFactory extends AbstractFactory { ...@@ -498,11 +501,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cq = cb.createQuery(String.class); CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<AttendanceDetail> root = cq.from( AttendanceDetail.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 ); 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_.yearString), year ));
p = cb.and(p, cb.equal( root.get(AttendanceDetail_.monthString), month )); 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信息中涉及的员工姓名列表") //@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的员工姓名列表")
...@@ -514,11 +517,11 @@ public class AttendanceDetailFactory extends AbstractFactory { ...@@ -514,11 +517,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cq = cb.createQuery(String.class); CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<AttendanceDetail> root = cq.from( AttendanceDetail.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 ); 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_.cycleYear), cycleYear ));
p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth )); 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信息中涉及的顶层组织名称列表") //@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的顶层组织名称列表")
...@@ -530,11 +533,11 @@ public class AttendanceDetailFactory extends AbstractFactory { ...@@ -530,11 +533,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cq = cb.createQuery(String.class); CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<AttendanceDetail> root = cq.from( AttendanceDetail.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 ); 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_.cycleYear), cycleYear ));
p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth )); 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信息中涉及的组织名称列表") //@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的组织名称列表")
...@@ -546,11 +549,11 @@ public class AttendanceDetailFactory extends AbstractFactory { ...@@ -546,11 +549,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cq = cb.createQuery(String.class); CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<AttendanceDetail> root = cq.from( AttendanceDetail.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 ); 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_.cycleYear), cycleYear ));
p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth )); 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信息中涉及的组织名称列表") //@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的组织名称列表")
...@@ -562,12 +565,12 @@ public class AttendanceDetailFactory extends AbstractFactory { ...@@ -562,12 +565,12 @@ public class AttendanceDetailFactory extends AbstractFactory {
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cq = cb.createQuery(String.class); CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<AttendanceDetail> root = cq.from( AttendanceDetail.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 ); 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_.cycleYear), cycleYear ));
p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth )); p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
p = cb.and(p, cb.equal( root.get(AttendanceDetail_.empName), employeeName )); 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 { ...@@ -580,10 +583,10 @@ public class AttendanceDetailFactory extends AbstractFactory {
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cq = cb.createQuery(String.class); CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<AttendanceDetail> root = cq.from( AttendanceDetail.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 //一般始终为true, id is not null
Predicate p = cb.equal( root.get(AttendanceDetail_.batchName), file_id ); 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("按年份月份查询某用户的打卡数据记录列表") //@MethodDescribe("按年份月份查询某用户的打卡数据记录列表")
...@@ -1304,9 +1307,9 @@ public class AttendanceDetailFactory extends AbstractFactory { ...@@ -1304,9 +1307,9 @@ public class AttendanceDetailFactory extends AbstractFactory {
List<Selection<?>> selectionList = new ArrayList<Selection<?>>(); List<Selection<?>> selectionList = new ArrayList<Selection<?>>();
selectionList.add(root.get(AttendanceDetail_.cycleYear )); selectionList.add(root.get(AttendanceDetail_.cycleYear ));
selectionList.add(root.get(AttendanceDetail_.cycleMonth )); 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{ public List<AttendanceCycles> getCyclesFromDetailWithDateSplit( String empName, Date startDate, Date endDate ) throws Exception{
...@@ -1322,9 +1325,9 @@ public class AttendanceDetailFactory extends AbstractFactory { ...@@ -1322,9 +1325,9 @@ public class AttendanceDetailFactory extends AbstractFactory {
List<Selection<?>> selectionList = new ArrayList<Selection<?>>(); List<Selection<?>> selectionList = new ArrayList<Selection<?>>();
selectionList.add(root.get(AttendanceDetail_.cycleYear )); selectionList.add(root.get(AttendanceDetail_.cycleYear ));
selectionList.add(root.get(AttendanceDetail_.cycleMonth )); 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条") //@MethodDescribe("查询未归档的条卡记录列表,最大2000条")
...@@ -1409,7 +1412,7 @@ public class AttendanceDetailFactory extends AbstractFactory { ...@@ -1409,7 +1412,7 @@ public class AttendanceDetailFactory extends AbstractFactory {
); );
p = cb.and( p, p_or ); p = cb.and( p, p_or );
} }
cq.distinct(true).select(root.get(AttendanceDetail_.empName)); cq.select(root.get(AttendanceDetail_.empName));
return em.createQuery(cq.where(p)).setMaxResults(100000).getResultList(); return em.createQuery(cq.where(p)).setMaxResults(100000).getResultList().stream().distinct().collect(Collectors.toList());
} }
} }
\ No newline at end of file
...@@ -15,6 +15,7 @@ import javax.persistence.metamodel.SingularAttribute; ...@@ -15,6 +15,7 @@ import javax.persistence.metamodel.SingularAttribute;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
public class DingdingAttendanceFactory extends AbstractFactory { public class DingdingAttendanceFactory extends AbstractFactory {
...@@ -315,8 +316,8 @@ public class DingdingAttendanceFactory extends AbstractFactory { ...@@ -315,8 +316,8 @@ public class DingdingAttendanceFactory extends AbstractFactory {
CriteriaQuery<String> query = cb.createQuery(String.class); CriteriaQuery<String> query = cb.createQuery(String.class);
Root<AttendanceDingtalkDetail> root = query.from(AttendanceDingtalkDetail.class); Root<AttendanceDingtalkDetail> root = query.from(AttendanceDingtalkDetail.class);
Predicate p = cb.between(root.get(AttendanceDingtalkDetail_.userCheckTime), startTime.getTime(), endTime.getTime()); Predicate p = cb.between(root.get(AttendanceDingtalkDetail_.userCheckTime), startTime.getTime(), endTime.getTime());
query.select(root.get(AttendanceDingtalkDetail_.o2Unit)).where(p).distinct(true); query.select(root.get(AttendanceDingtalkDetail_.o2Unit)).where(p);
return em.createQuery(query).getResultList(); return em.createQuery(query).getResultList().stream().distinct().collect(Collectors.toList());
} }
...@@ -608,8 +609,8 @@ public class DingdingAttendanceFactory extends AbstractFactory { ...@@ -608,8 +609,8 @@ public class DingdingAttendanceFactory extends AbstractFactory {
CriteriaQuery<String> query = cb.createQuery(String.class); CriteriaQuery<String> query = cb.createQuery(String.class);
Root<AttendanceQywxDetail> root = query.from(AttendanceQywxDetail.class); Root<AttendanceQywxDetail> root = query.from(AttendanceQywxDetail.class);
Predicate p = cb.between(root.get(AttendanceQywxDetail_.checkin_time_date), startTime, endTime); Predicate p = cb.between(root.get(AttendanceQywxDetail_.checkin_time_date), startTime, endTime);
query.select(root.get(AttendanceQywxDetail_.o2Unit)).where(p).distinct(true); query.select(root.get(AttendanceQywxDetail_.o2Unit)).where(p);
return em.createQuery(query).getResultList(); return em.createQuery(query).getResultList().stream().distinct().collect(Collectors.toList());
} }
/** /**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册