1
0

feat: 优化条件的构造

This commit is contained in:
2025-08-17 23:01:56 +08:00
parent ad56478d9b
commit 1a08b01e08

View File

@@ -127,15 +127,7 @@ public abstract class SimpleServiceSupport<ENTITY extends SimpleEntity> implemen
*/
@Override
public Long count() {
return repository.count(
(root, query, builder) ->
builder.and(
listPredicate(root, query, builder)
.stream()
.filter(ObjectHelper::isNotNull)
.toArray(Predicate[]::new)
)
);
return repository.count(this::listPredicate);
}
/**
@@ -148,15 +140,7 @@ public abstract class SimpleServiceSupport<ENTITY extends SimpleEntity> implemen
*/
@Override
public List<ENTITY> list() {
return repository.findAll(
(root, query, builder) ->
builder.and(
listPredicate(root, query, builder)
.stream()
.filter(ObjectHelper::isNotNull)
.toArray(Predicate[]::new)
)
);
return repository.findAll(this::listPredicate);
}
/**
@@ -172,9 +156,11 @@ public abstract class SimpleServiceSupport<ENTITY extends SimpleEntity> implemen
public List<ENTITY> list(Set<Long> ids) {
return repository.findAll(
(root, query, builder) -> {
var predicates = listPredicate(root, query, builder);
predicates.add(builder.in(root.get(IdOnlyEntity.Fields.id)).value(ids));
return builder.and(predicates.stream().filter(ObjectHelper::isNotNull).toArray(Predicate[]::new));
var predicate = listPredicate(root, query, builder);
var idsPredicate = builder.in(root.get(IdOnlyEntity.Fields.id)).value(ids);
return ObjectHelper.isNull(predicate)
? idsPredicate
: builder.and(predicate, idsPredicate);
}
);
}
@@ -245,10 +231,10 @@ public abstract class SimpleServiceSupport<ENTITY extends SimpleEntity> implemen
* @return List<Predicate> 返回构建的谓词列表
*/
@SuppressWarnings("unchecked")
protected List<Predicate> queryPredicates(Query.Queryable queryable, Root<ENTITY> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
protected Predicate queryPredicates(Query.Queryable queryable, Root<ENTITY> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
var predicates = new ArrayList<Predicate>();
if (ObjectHelper.isNull(queryable)) {
return predicates;
return null;
}
if (ObjectHelper.isNotEmpty(queryable.getNullEqual())) {
queryable.getNullEqual().forEach(column -> predicates.add(builder.isNull(column(root, column))));
@@ -352,7 +338,10 @@ public abstract class SimpleServiceSupport<ENTITY extends SimpleEntity> implemen
predicates.add(builder.between(column(root, column), (Comparable<Object>) value.getStart(), (Comparable<Object>) value.getEnd()).not());
});
}
return predicates;
return predicates.size() == 1
? predicates.get(0)
: builder.and(predicates.toArray(Predicate[]::new));
}
/**
@@ -457,8 +446,8 @@ public abstract class SimpleServiceSupport<ENTITY extends SimpleEntity> implemen
* @param builder JPA Criteria构建器
* @return List<Predicate> 返回查询条件谓词列表
*/
protected List<Predicate> listPredicate(Root<ENTITY> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
return new ArrayList<>(0);
protected Predicate listPredicate(Root<ENTITY> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
return null;
}
/**
@@ -483,9 +472,11 @@ public abstract class SimpleServiceSupport<ENTITY extends SimpleEntity> implemen
}
return repository.findAll(
(root, query, builder) -> {
var predicates = listPredicate(root, query, builder);
predicates.addAll(queryPredicates(listQuery.getQuery(), root, query, builder));
return builder.and(predicates.stream().filter(ObjectHelper::isNotNull).toArray(Predicate[]::new));
var predicate = listPredicate(root, query, builder);
var queryPredicate = queryPredicates(listQuery.getQuery(), root, query, builder);
return ObjectHelper.isNull(predicate)
? queryPredicate
: builder.and(predicate, queryPredicate);
},
pageRequest
);
@@ -507,9 +498,11 @@ public abstract class SimpleServiceSupport<ENTITY extends SimpleEntity> implemen
}
return repository.findOne(
(root, query, builder) -> {
var predicates = listPredicate(root, query, builder);
predicates.add(builder.equal(root.get(IdOnlyEntity.Fields.id), id));
return builder.and(predicates.stream().filter(ObjectHelper::isNotNull).toArray(Predicate[]::new));
var predicate = listPredicate(root, query, builder);
var idPredicate = builder.equal(root.get(IdOnlyEntity.Fields.id), id);
return ObjectHelper.isNull(predicate)
? idPredicate
: builder.and(predicate, idPredicate);
}
);
}