diff --git a/docs/datasource.md b/docs/datasource.md index 337936663..79828c0ac 100644 --- a/docs/datasource.md +++ b/docs/datasource.md @@ -14,6 +14,7 @@ |@FilterColumn |用于FilterBean过滤类的字段设置 | |@FilterJoinColumn |用于FilterBean过滤类的关联表字段设置 | |@FilterGroup | 用于FilterBean过滤类的过滤条件分组设置 | + |@FilterOrs | 用于FilterBean字段间的与或关系 | ## 操作方法 |系列方法 | 功能描述| @@ -130,10 +131,10 @@ public class Account {   修改实体对象: ```java - //根据主键更新单个字段 + //Lambda方式,根据主键更新单个字段 source.updateColumn(Account.class, "account1", Account::getRemark, "新备注"); - //根据主键更新多个字段 + //Lambda方式,根据主键更新多个字段 //等价sql: UPDATE t_account SET account_name='新名称', remark='新备注', age=age+2 WHERE account_id='account1'; source.updateColumn(Account.class, "account1", ColumnValue.set(Account::getAccountName, "新名称"), diff --git a/src/main/java/org/redkale/util/Attribute.java b/src/main/java/org/redkale/util/Attribute.java index 7d11b0a0c..7f16a2943 100644 --- a/src/main/java/org/redkale/util/Attribute.java +++ b/src/main/java/org/redkale/util/Attribute.java @@ -5,15 +5,15 @@ */ package org.redkale.util; -import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES; -import static org.redkale.asm.Opcodes.*; - import java.lang.reflect.*; import java.util.*; import java.util.function.*; import org.redkale.annotation.*; import org.redkale.asm.*; +import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES; +import static org.redkale.asm.Opcodes.*; import org.redkale.asm.Type; +import org.redkale.util.Attribute; /** * 该类实现动态映射一个JavaBean类中成员对应的getter、setter方法; 代替低效的反射实现方式。 @@ -284,6 +284,34 @@ public interface Attribute { } } + /** + * 根据一个Class和字段名生成 Attribute 的getter对象。 + * + * @param 依附类的类型 + * @param 字段类型 + * @param clazz 指定依附的类 + * @param fieldName 字段名,如果该字段不存在则抛异常 + * @return Attribute对象 + */ + public static Attribute createGetter(Class clazz, final String fieldName) { + if (Map.class.isAssignableFrom(clazz)) { + return (Attribute) map(fieldName); + } + String fieldAlias = fieldName; + java.lang.reflect.Field field = null; + java.lang.reflect.Method getter = null; + try { + field = clazz.getDeclaredField(fieldName); + } catch (NoSuchFieldException | SecurityException ex) { // 不是标准的getter、setter字段 + try { + getter = clazz.getMethod(fieldName); + } catch (NoSuchMethodException | SecurityException ex2) { + throw new RedkaleException(ex2); + } + } + return create(clazz, fieldAlias, (Class) null, field, getter, (java.lang.reflect.Method) null, null); + } + /** * 根据一个Class和field真实名称生成 Attribute 对象。 * @@ -791,7 +819,7 @@ public interface Attribute { } /** - * 根据Class、字段别名、字段类型、Field、getter和setter方法生成 Attribute 对象。 fieldAlias/fieldType、Field、tgetter、setter不能同时为null. + * 根据Class、字段别名、字段类型、Field、getter和setter方法生成 Attribute 对象。 fieldAlias/fieldType、Field、getter、setter不能同时为null. * * @param 依附类的类型 * @param 字段类型 diff --git a/src/main/java/org/redkale/util/MultiHashKeys.java b/src/main/java/org/redkale/util/MultiHashKeys.java index e11c7d5da..ef200c14f 100644 --- a/src/main/java/org/redkale/util/MultiHashKeys.java +++ b/src/main/java/org/redkale/util/MultiHashKeys.java @@ -138,7 +138,7 @@ class MultiHashKeys { String fieldName = subs[i]; Class clz = val.getClass(); Attribute attr = attrCache.computeIfAbsent( - clz.getName() + ":" + fieldName, k -> Attribute.create(clz, fieldName)); + clz.getName() + ":" + fieldName, k -> Attribute.createGetter(clz, fieldName)); val = attr.get(val); if (val == null) { return val;