Java CriteriaBuilder在表2中搜索获取性能问题
我试图通过CriteriaBuilder在两个不同的表中搜索列表关键字,并在第26行获得性能问题。 有人能帮我改进一下吗Java CriteriaBuilder在表2中搜索获取性能问题,java,Java,我试图通过CriteriaBuilder在两个不同的表中搜索列表关键字,并在第26行获得性能问题。 有人能帮我改进一下吗 public static Specification<TrainingBatchVolunteerDetails> filterVolunteers(final TrainingVolunteerForm form) { return new Specification<TrainingBatchVolunteerDetails>() {
public static Specification<TrainingBatchVolunteerDetails> filterVolunteers(final TrainingVolunteerForm form) {
return new Specification<TrainingBatchVolunteerDetails>() {
@Override
public Predicate toPredicate(Root<TrainingBatchVolunteerDetails> root,
CriteriaQuery<?> query, CriteriaBuilder cb) {
....
List<Predicate> predicates = new ArrayList<Predicate>();
Join<TrainingBatchVolunteerDetails, TrainingBatches> batches = root.join("batches");
Join<TrainingBatches, Training> training = batches.join("training");
training.join("trainingVolunteerDetails").join("eventBaseProfile");
Join<TrainingBatches, EventBaseProfile> eventBaseProfile = root.join("eventBaseProfile");
Join<EventBaseProfile, BaseProfile> baseProfile = eventBaseProfile.join("baseProfile");
Join<CtExtendProfile, BaseProfile> ctExtendProfile = null;
if (StringUtils.isNotEmpty(form.getNricName())) {
...
ctExtendProfile = baseProfile.join("ctExtendProfile", JoinType.LEFT);
List<String> keywords = new ArrayList<String>();
...
predicates.add(cb.or(
baseProfile.<String>get("identifierId").in(keywords),
ctExtendProfile.<String>get("birthCertificate").in(keywords)
));
}
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
}
};
}
公共静态规范过滤器志愿者(最终培训志愿者表){
返回新规范(){
@凌驾
公共谓词toPredicate(根,
CriteriaQuery查询,CriteriaBuilder(cb){
....
列表谓词=新的ArrayList();
Join batches=root.Join(“批”);
加入培训=批量。加入(“培训”);
培训。加入(“培训志愿者详细信息”)。加入(“eventBaseProfile”);
Join eventBaseProfile=root.Join(“eventBaseProfile”);
Join baseProfile=eventBaseProfile.Join(“baseProfile”);
Join-ctExtendProfile=null;
if(StringUtils.isNotEmpty(form.getNricName())){
...
ctExtendProfile=baseProfile.join(“ctExtendProfile”,JoinType.LEFT);
列表关键字=新建ArrayList();
...
谓词.add(cb.or(
baseProfile.get(“identifierId”)。在(关键字)中,
ctExtendProfile.get(“出生证”).in(关键字)
));
}
返回cb.and(predicates.toArray(新谓词[predicates.size()]);
}
};
}
第26行是哪一行?你对数据库中的关键行进行了索引吗?嗨,Arcans,我对关键行进行了索引。行性能是predicates.add(cb.or(baseProfile.get(“identifierId”).in(关键字),ctExtendProfile.get(“birthCertificate”).in(关键字));你的关键词列表有多大?你是否为“identifierId”和“birthCertificate”列都编制了索引?嗨,马特,是的,我编制了索引,并且列出了大约2-3个元素的关键字。每个表上有超过65k行数据。当我得到生成的查询并直接在mysql上运行时,总是需要60多秒。