MultiHashKey支持字段名同名的getter方法
This commit is contained in:
@@ -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, "新名称"),
|
||||||
|
|||||||
@@ -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> 字段类型
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user