使用反射方式获取JPA Entity的属性和值
作者:嗡汤圆 时间:2023-07-24 17:43:22
反射方式获取JPA Entity属性和值
在记录日志或者调试的时候,往往需要输出数据库查询或者写入的值,或者在接 * 互的时候,可能需要将实体转成JSON串传递出去。
在JPA中是以Entity的示例方式传递的。但是如果直接使用Entity.toString()
方法的话,输出的结果是entity@内存地址的形式,无法得知Entity的内部具体的属性和值。
以下描述采用反射方式获取Entity的字段和值的方法:
反射工具类
以将实体转为JSON串为例:
public class ReflectEntity{
public static String toStr(Object o){
try{
StringBuilder sb = new StringBuilder();
sb.append("{");
Class cls = o.getClass();
Field[] fields = cls.getDeclaredFields();
for(Field f : fields){
f.setAccessible(true);
sb.append("\"").append(f.getName()).append("\":\"").append(f.get(o)).append("\",");
}
return String.format("%s}",sb.subString(0,sb.length()-1));
} catch(Exception e){
return null;
}
}
}
重写toString方法
假设有个JPA Entity:
@Entity
public class E{
private String colA;
private String colB;
//getter, setter 略
//在此处使用反射方法即可
@Override
public String toString(){
return ReflectEntity.toStr(this);
}
}
通过以上改造后,记录或者通过网络接口调用传输Entity或者List<Entity>都能顺利转为JSON串。
通过反射获取Entity的数据
应用场景:有些时候SQL比较难拼接(比如说:不确定通过哪个字段获取数据),这个时候我们可以利用java反射来获取数据
1.Entity实体类
@Entity
@Table(name = EntitlementDbConstants.CUSTOMER_MASTER_DATA_VIEW)
public abstract class CustomerMasterDataView
{
private static final long serialVersionUID = 1963275800615627823L;
@ExtendField
@Column(name = CommonHanaDbExtendsColumnConstants.S_EX_1)
private String sEX1;
@ExtendField
@Column(name = CommonHanaDbExtendsColumnConstants.S_EX_2)
private String sEX2;
//省略get,set方法
}
2.通过java反射获取Entity数据
private List<Map<String, Object>> getExtensionAttributeValue(List<CustomerMasterDataView> customerMasterDataViews, String field, String type)
{
List<Object> noRepeakValue = new ArrayList<>();
List<Map<String, Object>> valueList =new ArrayList<>();
Map<String, Object> map = null;
Object obj = null;
String methodName = "get" + StringUtils.uncapitalize(StringUtils.replaceEach(field, new String[] //通过get方法获取数据
{ "_" }, new String[]
{ "" }));
for(CustomerMasterDataView customerMasterDataView:customerMasterDataViews)
{
try
{
Method method = customerMasterDataView.getClass().getMethod(methodName);
obj = method.invoke(customerMasterDataView);// obj就是我们获取某个字段的值
}
catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e)
{
if (logger.isDebugEnabled())
logger.debug("Could not reflect the method {}", methodName, e);
}
map = formatAttributeValue(obj, type, noRepeakValue); // 格式化数据,自定义的方法
if(null != map)
{
valueList.add(map);
}
}
return valueList;
}
来源:https://blog.csdn.net/tzdwsy/article/details/47375759
标签:反射,JPA,Entity,属性
0
投稿
猜你喜欢
C#单线程和多线程的端口扫描器应用比较详解
2023-08-07 21:01:45
详解WMI RPC 服务器不可用的解决方案
2023-09-14 14:51:54
Android SQLite数据库加密的操作方法
2021-10-14 11:22:05
Spring+SpringMVC+MyBatis深入学习及搭建(三)之MyBatis全局配置文件解析
2022-03-21 05:25:23
Springboot如何操作redis数据
2022-05-30 21:36:41
java与scala数组及集合的基本操作对比
2022-03-03 05:52:27
C#中常用的运算符总结
2023-10-10 04:09:32
C#微信开发之微信公众号标签管理功能
2023-04-17 20:20:44
Android自定义viewGroup实现点击动画效果
2022-09-01 00:27:07
java反射获取和调用方法
2021-11-23 11:05:02
android开机自启动APP及使用adb命令测试方法
2022-03-07 06:28:54
Java请求转发和请求重定向区别详解
2023-05-19 07:30:17
Java List分页功能实现代码实例
2022-06-02 13:56:14
Android 7.0新特性详解
2022-10-10 07:11:56
MyBatis动态Sql之if标签的用法详解
2023-04-20 14:02:26
全面理解java中的异常处理机制
2023-10-26 04:08:20
Java拦截器Interceptor实现原理及代码示例
2023-11-04 03:49:32
java8 统计字符串字母个数的几种方法总结(推荐)
2023-09-25 17:37:48
C#实现记事本查找与替换功能
2022-03-24 00:20:58
OpenHarmony实现屏幕亮度动态调节方法详解
2022-01-13 18:24:08