2021年1月27日星期三

querydsl can't get data immediately after Jpa Insert

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;

https://stackoverflow.com/questions/65930226/querydsl-cant-get-data-immediately-after-jpa-insert January 28, 2021 at 10:32AM

没有评论:

发表评论