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