From 978afdd829c819c6771a849c5672f713b2d7b42b Mon Sep 17 00:00:00 2001 From: redkale Date: Tue, 25 Jun 2024 12:24:35 +0800 Subject: [PATCH] =?UTF-8?q?MultiHashKey=E6=94=AF=E6=8C=81=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E5=90=8D=E5=90=8C=E5=90=8D=E7=9A=84getter=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/datasource.md | 5 +-- src/main/java/org/redkale/util/Attribute.java | 36 ++++++++++++++++--- .../java/org/redkale/util/MultiHashKeys.java | 2 +- 3 files changed, 36 insertions(+), 7 deletions(-) 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;