querydsl can't get data immediately after Jpa Insert

Viewed 136

I have a java method with insert and select like that:

    @Override
    public Page<ApprovalProcessEntity> getApprovalProcess(int page, int size, String approvalNum, String approvalType, int approvalStatus, Date start, Date end) {
        //jpa inseart
        checkAndInsertApprovalProcess();
        //querydsl select
        return getApprovalProcess2(page, size, approvalNum, approvalType, approvalStatus, start, end);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void checkAndInsertApprovalProcess() {
        List<Task> list = taskService.createTaskQuery().taskCandidateOrAssigned(curUserId()).list();
        String confirmVar = "IS_CONFIRM";
        List<ApprovalProcessEntity> entities = new ArrayList<>();
        Set<String> processInstanceIds = new HashSet<>();
        for (Task task : list) {
            processInstanceIds.add(task.getProcessInstanceId());
        }
        Map<String, ApprovalApplyEntity> map = approvalApplyDao.findAllByProcessInstanceIdIn(processInstanceIds).stream().collect(Collectors.toMap(ApprovalApplyEntity::getProcessInstanceId, k -> k));
        for (Task task : list) {
            Object confirm = taskService.getVariable(task.getId(), confirmVar);
            if (confirm != null) {
                continue;
            }
            taskService.setVariable(task.getId(), confirmVar, true);
            ApprovalProcessEntity entity = new ApprovalProcessEntity();
            String processInstanceId = task.getProcessInstanceId();
            ApprovalApplyEntity apply = map.get(processInstanceId);
            entity.setApprovalStatus(1);
            entity.setCurNode(task.getName());
            entities.add(entity);
        }
        approvalProcessDao.saveAll(entities);
    }
    Page<ApprovalProcessEntity> getApprovalProcess2(int page, int size, String approvalNum, String approvalType, int approvalStatus, Date start, Date end) {
        String userId = curUserId();
        QApprovalProcessEntity qEntity = QApprovalProcessEntity.approvalProcessEntity;
        JPAQuery<ApprovalProcessEntity> jpaQuery = queryFactory
                .selectFrom(qEntity)
                .where(qEntity.createTime.between(start, end))
                .where(qEntity.createPerson.eq(userId));
        if (StrUtil.isNotBlank(approvalNum)) {
            jpaQuery = jpaQuery.where(qEntity.approvalNum.eq(approvalNum));
        }
        if (StrUtil.isNotBlank(approvalType)) {
            jpaQuery = jpaQuery.where(qEntity.approvalType.eq(approvalType));
        }
        if (approvalStatus != -1) {
            jpaQuery = jpaQuery.where(qEntity.approvalStatus.eq(approvalStatus));
        }
        PageRequest pr = PageRequest.of(page, size);
        List<ApprovalProcessEntity> entities = jpaQuery.offset(pr.getOffset()).limit(pr.getPageSize()).fetch();
        return new PageImpl<>(entities, pr, jpaQuery.fetchCount());
    }

if some task haven't be confirmed,insert a new entity in to table;

then select data from this table; if I use the following code, when I had a new task, it can insert successfully, but can't select data immediately,

if call getApprovalProcess() again, getApprovalProcess2() method work well, so how can I select data immediately after insert; meanwhile, if i change getApprovalProcess2() like:

    Page<ApprovalProcessEntity> getApprovalProcess2(int page, int size, String approvalNum, String approvalType, int approvalStatus, Date start, Date end) {
        return approvalProcessDao.findAll(PageRequest.of(page, size));
    }

then create a new task and call getApprovalProcess() method again() it can select data immediately, work well but actually what I want is Previous Impl,so what should I do that can make it work;

0 Answers
Related