MultiHashKey支持字段名同名的getter方法

This commit is contained in:
redkale
2024-06-25 12:24:35 +08:00
parent 38e8da994e
commit 978afdd829
3 changed files with 36 additions and 7 deletions

View File

@@ -14,6 +14,7 @@
|@FilterColumn |用于FilterBean过滤类的字段设置 | |@FilterColumn |用于FilterBean过滤类的字段设置 |
|@FilterJoinColumn |用于FilterBean过滤类的关联表字段设置 | |@FilterJoinColumn |用于FilterBean过滤类的关联表字段设置 |
|@FilterGroup | 用于FilterBean过滤类的过滤条件分组设置 | |@FilterGroup | 用于FilterBean过滤类的过滤条件分组设置 |
|@FilterOrs | 用于FilterBean字段间的与或关系 |
## 操作方法 ## 操作方法
|系列方法 | 功能描述| |系列方法 | 功能描述|
@@ -130,10 +131,10 @@ public class Account {
  修改实体对象:   修改实体对象:
```java ```java
//根据主键更新单个字段 //Lambda方式根据主键更新单个字段
source.updateColumn(Account.class, "account1", Account::getRemark, "新备注"); source.updateColumn(Account.class, "account1", Account::getRemark, "新备注");
//根据主键更新多个字段 //Lambda方式根据主键更新多个字段
//等价sql: UPDATE t_account SET account_name='新名称', remark='新备注', age=age+2 WHERE account_id='account1'; //等价sql: UPDATE t_account SET account_name='新名称', remark='新备注', age=age+2 WHERE account_id='account1';
source.updateColumn(Account.class, "account1", source.updateColumn(Account.class, "account1",
ColumnValue.set(Account::getAccountName, "新名称"), ColumnValue.set(Account::getAccountName, "新名称"),

View File

@@ -5,15 +5,15 @@
*/ */
package org.redkale.util; package org.redkale.util;
import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES;
import static org.redkale.asm.Opcodes.*;
import java.lang.reflect.*; import java.lang.reflect.*;
import java.util.*; import java.util.*;
import java.util.function.*; import java.util.function.*;
import org.redkale.annotation.*; import org.redkale.annotation.*;
import org.redkale.asm.*; 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.asm.Type;
import org.redkale.util.Attribute;
/** /**
* 该类实现动态映射一个JavaBean类中成员对应的getter、setter方法 代替低效的反射实现方式。 * 该类实现动态映射一个JavaBean类中成员对应的getter、setter方法 代替低效的反射实现方式。
@@ -284,6 +284,34 @@ public interface Attribute<T, F> {
} }
} }
/**
* 根据一个Class和字段名生成 Attribute 的getter对象。
*
* @param <T> 依附类的类型
* @param <F> 字段类型
* @param clazz 指定依附的类
* @param fieldName 字段名,如果该字段不存在则抛异常
* @return Attribute对象
*/
public static <T, F> Attribute<T, F> createGetter(Class<T> 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 对象。 * 根据一个Class和field真实名称生成 Attribute 对象。
* *
@@ -791,7 +819,7 @@ public interface Attribute<T, F> {
} }
/** /**
* 根据Class、字段别名、字段类型、Field、getter和setter方法生成 Attribute 对象。 fieldAlias/fieldType、Field、tgetter、setter不能同时为null. * 根据Class、字段别名、字段类型、Field、getter和setter方法生成 Attribute 对象。 fieldAlias/fieldType、Field、getter、setter不能同时为null.
* *
* @param <T> 依附类的类型 * @param <T> 依附类的类型
* @param <F> 字段类型 * @param <F> 字段类型

View File

@@ -138,7 +138,7 @@ class MultiHashKeys {
String fieldName = subs[i]; String fieldName = subs[i];
Class clz = val.getClass(); Class clz = val.getClass();
Attribute attr = attrCache.computeIfAbsent( Attribute attr = attrCache.computeIfAbsent(
clz.getName() + ":" + fieldName, k -> Attribute.create(clz, fieldName)); clz.getName() + ":" + fieldName, k -> Attribute.createGetter(clz, fieldName));
val = attr.get(val); val = attr.get(val);
if (val == null) { if (val == null) {
return val; return val;