fix(jpa): 增加空值检查并优化查询条件处理
- 在 list 方法中增加空集合检查,避免无效查询 - 在 value 方法中增加空值检查,直接返回 null - 重构查询条件处理逻辑,复用 path 变量减少重复调用
This commit is contained in:
@@ -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());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user