1
0

fix(jpa): 增加空值检查并优化查询条件处理

- 在 list 方法中增加空集合检查,避免无效查询
- 在 value 方法中增加空值检查,直接返回 null
- 重构查询条件处理逻辑,复用 path 变量减少重复调用
This commit is contained in:
2026-01-06 10:58:22 +08:00
parent e8ffaab6a8
commit 116dc148f2

View File

@@ -177,6 +177,9 @@ public abstract class SimpleServiceSupport<ENTITY extends SimpleEntity> implemen
*/
@Override
public List<ENTITY> list(Set<Long> ids) {
if (ObjectHelper.isEmpty(ids)) {
return List.of();
}
return repository.findAll(
(root, query, builder) -> {
var predicate = listPredicate(root, query, builder);
@@ -228,6 +231,9 @@ public abstract class SimpleServiceSupport<ENTITY extends SimpleEntity> implemen
*/
@SuppressWarnings({"unchecked", "rawtypes"})
private <Y> Object value(Path<Y> column, Object value) {
if (ObjectHelper.isNull(value)) {
return null;
}
var javaType = column.getJavaType();
if (javaType.isEnum()) {
if (value instanceof String enumName) {
@@ -295,58 +301,58 @@ public abstract class SimpleServiceSupport<ENTITY extends SimpleEntity> implemen
}
if (ObjectHelper.isNotEmpty(queryable.getLike())) {
queryable.getLike().forEach((column, value) -> {
var path = column(root, column);
var path = this.<String>column(root, column);
checkString(path, value, column);
predicates.add(builder.like(column(root, column), value));
predicates.add(builder.like(path, value));
});
}
if (ObjectHelper.isNotEmpty(queryable.getNotLike())) {
queryable.getNotLike().forEach((column, value) -> {
var path = column(root, column);
var path = this.<String>column(root, column);
checkString(path, value, column);
predicates.add(builder.notLike(column(root, column), value));
predicates.add(builder.notLike(path, value));
});
}
if (ObjectHelper.isNotEmpty(queryable.getContain())) {
queryable.getContain().forEach((column, value) -> {
var path = this.<String>column(root, column);
checkString(path, value, column);
predicates.add(builder.like(column(root, column), "%" + value + "%"));
predicates.add(builder.like(path, "%" + value + "%"));
});
}
if (ObjectHelper.isNotEmpty(queryable.getNotContain())) {
queryable.getNotContain().forEach((column, value) -> {
var path = this.<String>column(root, column);
checkString(path, value, column);
predicates.add(builder.notLike(column(root, column), "%" + value + "%"));
predicates.add(builder.notLike(path, "%" + value + "%"));
});
}
if (ObjectHelper.isNotEmpty(queryable.getStartWith())) {
queryable.getStartWith().forEach((column, value) -> {
var path = this.<String>column(root, column);
checkString(path, value, column);
predicates.add(builder.like(column(root, column), value + "%"));
predicates.add(builder.like(path, value + "%"));
});
}
if (ObjectHelper.isNotEmpty(queryable.getNotStartWith())) {
queryable.getNotStartWith().forEach((column, value) -> {
var path = this.<String>column(root, column);
checkString(path, value, column);
predicates.add(builder.notLike(column(root, column), value + "%"));
predicates.add(builder.notLike(path, value + "%"));
});
}
if (ObjectHelper.isNotEmpty(queryable.getEndWith())) {
queryable.getEndWith().forEach((column, value) -> {
var path = this.<String>column(root, column);
checkString(path, value, column);
predicates.add(builder.like(column(root, column), "%" + value));
predicates.add(builder.like(path, "%" + value));
});
}
if (ObjectHelper.isNotEmpty(queryable.getNotEndWith())) {
queryable.getNotEndWith().forEach((column, value) -> {
var path = this.<String>column(root, column);
checkString(path, value, column);
predicates.add(builder.notLike(column(root, column), "%" + value));
predicates.add(builder.notLike(path, "%" + value));
});
}
if (ObjectHelper.isNotEmpty(queryable.getGreat())) {
@@ -395,14 +401,14 @@ public abstract class SimpleServiceSupport<ENTITY extends SimpleEntity> implemen
queryable.getBetween().forEach((column, value) -> {
var path = this.<Comparable<Object>>column(root, column);
checkComparable(path, value, column);
predicates.add(builder.between(column(root, column), (Comparable<Object>) value(path, value.getStart()), (Comparable<Object>) value(path, value.getEnd())));
predicates.add(builder.between(path, (Comparable<Object>) value(path, value.getStart()), (Comparable<Object>) value(path, value.getEnd())));
});
}
if (ObjectHelper.isNotEmpty(queryable.getNotBetween())) {
queryable.getNotBetween().forEach((column, value) -> {
var path = this.<Comparable<Object>>column(root, column);
checkComparable(path, value, column);
predicates.add(builder.between(column(root, column), (Comparable<Object>) value(path, value.getStart()), (Comparable<Object>) value(path, value.getEnd())).not());
predicates.add(builder.between(path, (Comparable<Object>) value(path, value.getStart()), (Comparable<Object>) value(path, value.getEnd())).not());
});
}