diff --git a/continew-starter-data/continew-starter-data-mybatis-plus/src/main/java/top/charles7c/continew/starter/data/mybatis/plus/query/Query.java b/continew-starter-data/continew-starter-data-mybatis-plus/src/main/java/top/charles7c/continew/starter/data/mybatis/plus/query/Query.java
index 1a8e13d1..aa4947df 100644
--- a/continew-starter-data/continew-starter-data-mybatis-plus/src/main/java/top/charles7c/continew/starter/data/mybatis/plus/query/Query.java
+++ b/continew-starter-data/continew-starter-data-mybatis-plus/src/main/java/top/charles7c/continew/starter/data/mybatis/plus/query/Query.java
@@ -31,20 +31,15 @@ import java.lang.annotation.*;
public @interface Query {
/**
- * 属性名(默认和使用该注解的属性的名称一致)
+ * 属性名数组
+ * columns为空 走实体类的字段,并且根据queryType来查询;
+ * columns不为空且columns长度为1,走columns[0]的字段,并且根据queryType来查询;
+ * columns不为空且columns长度大于1,走columns的所有字段, 并且根据queryType来查询; columns之间的处理是OR操作。
*/
- String property() default "";
+ String[] columns() default {};
/**
* 查询类型(等值查询、模糊查询、范围查询等)
*/
QueryType type() default QueryType.EQUAL;
-
- /**
- * 多属性模糊查询,仅支持 String 类型属性
- *
- * 例如:@Query(blurry = {"username", "email"}) 表示根据用户名和邮箱模糊查询
- *
- */
- String[] blurry() default {};
}
diff --git a/continew-starter-data/continew-starter-data-mybatis-plus/src/main/java/top/charles7c/continew/starter/data/mybatis/plus/query/QueryHelper.java b/continew-starter-data/continew-starter-data-mybatis-plus/src/main/java/top/charles7c/continew/starter/data/mybatis/plus/query/QueryHelper.java
index f6d51d55..3234042e 100644
--- a/continew-starter-data/continew-starter-data-mybatis-plus/src/main/java/top/charles7c/continew/starter/data/mybatis/plus/query/QueryHelper.java
+++ b/continew-starter-data/continew-starter-data-mybatis-plus/src/main/java/top/charles7c/continew/starter/data/mybatis/plus/query/QueryHelper.java
@@ -16,10 +16,10 @@
package top.charles7c.continew.starter.data.mybatis.plus.query;
-import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -30,6 +30,7 @@ import top.charles7c.continew.starter.core.util.validate.ValidationUtils;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
/**
* 查询助手
@@ -71,15 +72,13 @@ public class QueryHelper {
* @param 查询条件数据类型
* @param 查询数据类型
*/
- private static void buildQuery(Q query, Field field, QueryWrapper queryWrapper) {
+ public static void buildQuery(Q query, Field field, QueryWrapper queryWrapper) {
boolean accessible = field.canAccess(query);
try {
field.setAccessible(true);
- // 没有 @Query,直接返回
- Query queryAnnotation = field.getAnnotation(Query.class);
- if (null == queryAnnotation) {
- return;
- }
+
+ String fieldName = field.getName();
+ String columnName = StrUtil.toUnderlineCase(fieldName);
// 如果字段值为空,直接返回
Object fieldValue = field.get(query);
@@ -87,8 +86,58 @@ public class QueryHelper {
return;
}
+ // 获取 Query 注解信息
+ Query queryAnnotation = field.getAnnotation(Query.class);
+ // 没有@Query注解,默认走实体类的字段 EQ精确 查询;
+ if (Objects.isNull(queryAnnotation)) {
+ queryWrapper.eq(columnName, fieldValue);
+ return;
+ }
+
+ String[] columns = queryAnnotation.columns();
+ if (ArrayUtils.isEmpty(columns)) {
+ columnName = StrUtil.toUnderlineCase(columnName);
+ } else if (columns.length == 1) {
+ columnName = StrUtil.toUnderlineCase(columns[0]);
+ } else {
+ QueryType queryType = queryAnnotation.type();
+ queryWrapper.and(wrapper -> {
+ for (String column : columns) {
+ String underline = StrUtil.toUnderlineCase(column);
+ // 解析多属性查询
+ switch (queryType) {
+ case EQUAL -> queryWrapper.or().eq(underline, fieldValue);
+ case NOT_EQUAL -> queryWrapper.or().ne(underline, fieldValue);
+ case GREATER_THAN -> queryWrapper.or().gt(underline, fieldValue);
+ case LESS_THAN -> queryWrapper.or().lt(underline, fieldValue);
+ case GREATER_THAN_OR_EQUAL -> queryWrapper.or().ge(underline, fieldValue);
+ case LESS_THAN_OR_EQUAL -> queryWrapper.or().le(underline, fieldValue);
+ case BETWEEN -> {
+ List