1
0

refactor(web):优化确认服务和数据资源服务的查询逻辑

This commit is contained in:
2024-12-13 17:02:55 +08:00
parent 8abd31cd97
commit db05b69122
2 changed files with 32 additions and 13 deletions

View File

@@ -17,6 +17,8 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.transaction.Transactional;
@@ -52,15 +54,21 @@ public class ConfirmationService extends SimpleServiceSupport<Confirmation> impl
if (User.isAdministrator(loginUser)) {
return Lists.immutable.empty();
}
Join<Confirmation, CheckOrder> orderJoin = root.join(Confirmation_.order, JoinType.LEFT);
return Lists.immutable.of(builder.or(
builder.equal(root.get(Confirmation_.createdUser), loginUser),
builder.and(
builder.equal(root.get(Confirmation_.order).get(CheckOrder_.target), CheckOrder.Target.ROLE),
builder.equal(root.get(Confirmation_.order).get(CheckOrder_.targetRole), loginUser.getRole())
builder.isNotNull(orderJoin),
builder.or(
builder.and(
builder.equal(orderJoin.get(CheckOrder_.target), CheckOrder.Target.ROLE),
builder.equal(orderJoin.get(CheckOrder_.targetRole), loginUser.getRole())
),
builder.and(
builder.equal(root.get(Confirmation_.order).get(CheckOrder_.target), CheckOrder.Target.USER),
builder.equal(root.get(Confirmation_.order).get(CheckOrder_.targetUser), loginUser)
builder.equal(orderJoin.get(CheckOrder_.target), CheckOrder.Target.USER),
builder.equal(orderJoin.get(CheckOrder_.targetUser), loginUser)
)
)
)
));
}

View File

@@ -2,7 +2,6 @@ package com.eshore.gringotts.web.domain.resource.service;
import com.eshore.gringotts.web.domain.authentication.entity.Authentication;
import com.eshore.gringotts.web.domain.authentication.entity.Authentication_;
import com.eshore.gringotts.web.domain.base.entity.CheckingNeededEntity;
import com.eshore.gringotts.web.domain.base.service.SimpleServiceSupport;
import com.eshore.gringotts.web.domain.confirmation.entity.Confirmation;
import com.eshore.gringotts.web.domain.confirmation.entity.Confirmation_;
@@ -19,6 +18,7 @@ import com.eshore.gringotts.web.helper.EntityHelper;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery;
@@ -79,23 +79,34 @@ public class DataResourceService extends SimpleServiceSupport<DataResource> {
}
public ImmutableList<DataResource> listNoConfirmation() {
return Lists.immutable.ofAll(dataResourceRepository.findAllByConfirmationIsNull());
return Lists.immutable.ofAll(dataResourceRepository.findAll(
(root, query, builder) -> {
Join<DataResource, Confirmation> confirmationJoin = root.join(DataResource_.confirmation, JoinType.LEFT);
return builder.and(
builder.isNull(confirmationJoin.get(Confirmation_.id)),
builder.equal(root.get(DataResource_.createdUser), userService.currentLoginUser())
);
}
));
}
public ImmutableList<DataResource> listNoAuthentication() {
return Lists.immutable.ofAll(dataResourceRepository.findAll(
(root, query, builder) -> {
Join<DataResource, Confirmation> confirmationJoin = root.join("confirmation");
confirmationJoin.on(builder.equal(confirmationJoin.get("state"), CheckingNeededEntity.State.NORMAL));
Join<DataResource, Confirmation> confirmationJoin = root.join(DataResource_.confirmation, JoinType.LEFT);
confirmationJoin.on(builder.equal(confirmationJoin.get(Confirmation_.state), Confirmation.State.NORMAL));
Subquery<Authentication> authenticationSubquery = query.subquery(Authentication.class);
Root<Authentication> authenticationRoot = authenticationSubquery.from(Authentication.class);
authenticationSubquery.select(authenticationRoot)
.where(
builder.equal(authenticationRoot.get("target"), root),
builder.equal(authenticationRoot.get("createdUser"), userService.currentLoginUser())
builder.equal(authenticationRoot.get(Authentication_.target), root),
builder.equal(authenticationRoot.get(Authentication_.createdUser), userService.currentLoginUser())
);
return builder.and(
builder.exists(authenticationSubquery).not(),
builder.equal(root.get(DataResource_.createdUser), userService.currentLoginUser())
);
return builder.exists(authenticationSubquery).not();
}
));
}