使用反射方式获取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
  • asp之家 软件编程 m.aspxhome.com