Java CriteriaBuilder在表2中搜索获取性能问题

Java CriteriaBuilder在表2中搜索获取性能问题,java,Java,我试图通过CriteriaBuilder在两个不同的表中搜索列表关键字,并在第26行获得性能问题。 有人能帮我改进一下吗 public static Specification<TrainingBatchVolunteerDetails> filterVolunteers(final TrainingVolunteerForm form) { return new Specification<TrainingBatchVolunteerDetails>() {

我试图通过CriteriaBuilder在两个不同的表中搜索列表关键字,并在第26行获得性能问题。 有人能帮我改进一下吗

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多秒。