使用反射方式获取JPA Entity的属性和值
作者:嗡汤圆 发布时间:2023-07-24 17:43:22
标签:反射,JPA,Entity,属性
反射方式获取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


猜你喜欢
- 前段时间分享了《阅读跟踪 Java 源码的几个小技巧》是基于 Eclipse 版本的,看大家的留言都是想要 IDEA 版本的源码阅读技巧。所
- 本文较为详细的分析了Java中对象的销毁方法。分享给大家供大家参考。具体分析如下:Java中的基本数据类型变量和对象的名称引用变量如定义在方
- 最小堆基本思想:堆对应一棵完全二叉树,且所有非叶结点的值均不大于(或不小于)其子女的值,根结点(堆顶元素)的值是最小(或最大)的,每次都取堆
- 前言锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。
- 目录ShutdownHook介绍ShutdownHook原理ShutdownHook的数据结构与执行顺序ShutdownHook触发点Shu
- 在国际化环境下,越来越多的程序需要做多语言版本,以适应各种业务需求的变化。在Winform应用程序中实现多语言也有常规的处理方式处理,不过需
- 如果没有安装过maven,是用的idea自带的maven,那就是idea的安装目录下 /plugins/maven/lib/maven3这个
- 之前的文章向大家介绍了几个项目中常用的实用功能,那么在这篇文中,我将向大家介绍如何获取Android手机中已经安装的手机应用程序,好了,废话
- 小编为面试Java程序员的朋友们整理了2017非常热门的面试中的笔试试题,如果你是一个正在准备面试Java程序员的读者,赶快学习一下吧。1,
- 本文实例讲述了C#基于委托实现多线程之间操作的方法。分享给大家供大家参考,具体如下:有的时候我们要起多个线程,更多的时候可能会有某个线程会去
- 使用poi生成excel通常包含一下几个步骤创建一个工作簿创建一个sheet创建一个Row对象创建一个cell对象(1个row+1个cell
- 高并发访问时,缓存、限流、降级往往是系统的利剑,在互联网蓬勃发展的时期,经常会面临因用户暴涨导致的请求不可用的情况,甚至引发连锁反映导致整个
- 单例模式的介绍说到单例模式,大家第一反应应该就是——什么是单例模式?,从“单例”字面意思上理解为——一个类只有一个实例,所以单例模式也就是保
- 用Flutter实现弹幕功能,轻松实现虎牙、斗鱼的弹幕效果。先来一张效果图:实现原理弹幕的实现原理非常简单,即将一条弹幕从左侧平移到右侧,当
- 简单版/** * 产生4位随机数(0000-9999) * * @return 4位随机数 &nb
- 还是我们自定View的那几个步骤:1、自定义View的属性2、在View的构造方法中获得我们自定义的属性[ 3、重写onMesure ]4、
- 本文实例讲述了Android中ListView下拉刷新的实现方法。分享给大家供大家参考,具体如下:ListView中的下拉刷新是非常常见的,
- 由于公司平台访问人数逐渐增多,公司项目的数据库已经几次出现宕机现象。为减轻数据库压力,我上个月对公司项目做了下调整。把新闻板块提取出来单独一
- import java.util.Scanner;public class VariableExchange { &n
- SpringBoot2.3.1版本源码一、SpringBoot启动的时候加载主配置类,通过@EnableAutoConfiguration注解