使用反射方式获取JPA Entity的属性和值

目录
  • 反射方式获取JPAEntity属性和值
    • 反射工具类
    • 重写toString方法
  • 通过反射获取Entity的数据
    • 1.Entity实体类
    • 2.通过java反射获取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;
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 对Jpa中Entity关系映射中mappedBy的全面理解

    目录 对Jpa Entity关系映射中mappedBy的理解 对于mappedBy复习下 举例说明 Spring-jpa中mappedBy的作用 使用@JoinColumn存在的问题 使用mappedBy 对Jpa Entity关系映射中mappedBy的理解 mappedBy 单向关系不需要设置该属性,双向关系必须设置,避免双方都建立外键字段数据库中1对多的关系,关联关系总是被多方维护的即外键建在多方,我们在单方对象的@OneToMany(mappedby="")把关系的维护交给多方

  • JPA中EntityListeners注解的使用详解

    使用场景 EntityListeners在jpa中使用,如果你是mybatis是不可以用的 它的意义 对实体属性变化的跟踪,它提供了保存前,保存后,更新前,更新后,删除前,删除后等状态,就像是拦截器一样,你可以在拦截方法里重写你的个性化逻辑. 它的使用 定义接口,如实体追踪 /** * 数据建立与更新. */ public interface DataEntity { Timestamp getDateCreated(); void setDateCreated(Timestamp dateCr

  • JPA配置方式+逆向工程映射到Entity实体类

    目录 将已有项目转换成JPAproject.. 此时会显示警告 准备:wildfly/tomcat或者其他服务器 你的数据库的Driver,(此处用的mysql-connecter-java-5.1.39-bin.jar) 将已有项目转换成JPA project.. Step1:[选中项目,右键] -> [Configure] -> [Conver to JPA project] Step2.1:Configuration有custom(用户定制)\default默认等选项,选择custom,

  • 使用反射方式获取JPA Entity的属性和值

    目录 反射方式获取JPAEntity属性和值 反射工具类 重写toString方法 通过反射获取Entity的数据 1.Entity实体类 2.通过java反射获取Entity数据 反射方式获取JPA Entity属性和值 在记录日志或者调试的时候,往往需要输出数据库查询或者写入的值,或者在接口交互的时候,可能需要将实体转成JSON串传递出去. 在JPA中是以Entity的示例方式传递的.但是如果直接使用Entity.toString() 方法的话,输出的结果是entity@内存地址的形式,无法

  • 用jquery获取自定义的标签属性的值简单实例

    如下所示: <tr class="gradeX" role="row" id="1001"> <td>王羲之</td> <td>2016-01-06</td> <td name="phone" style="display:none;">13680130700</td> <td name="pwd"

  • Java反射如何获取字段属性值

    目录 Java反射获取字段属性值 案例 反射对象获取属性和值凭借成string 描述 直接上代码 Java反射获取字段属性值 反射获取Java类的所有字段,包括所有父类中的字段. 类自身的字段可直接通过方法 getDeclaredFields()[获取所有修饰符字段]或者getFields()[获取public修饰的字段]获取, 但父类中的字段暂时没有发现直接获取的方式. 需要递归获取所有的父类, 然后获取他们的字段, 最终获取到类的所有字段. 如果要获取字段值, 则需要设置字段可访问即:fie

  • Java利用反射获取object的属性和值代码示例

    在看反射顺便做个笔记,目前知道的反射的Object都是要有对象的也就是实体Bean. referance:Java反射简易教程 import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 反射处理Bean,得到里面的属性值 * * @author liulinsen * */ publ

  • Java反射通过Getter方法获取对象VO的属性值过程解析

    这篇文章主要介绍了Java反射通过Getter方法获取对象VO的属性值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 有时候,需要动态获取对象的属性值. 比如,给你一个List,要你遍历这个List的对象的属性,而这个List里的对象并不固定.比如,这次User,下次可能是Company. e.g. 这次我需要做一个Excel导出的工具类,导出的批量数据是以List类型传入的,List里的对象自然每次都不同,这取决于需要导出什么信息.

  • PHP的反射动态获取类方法、属性、参数操作示例

    本文实例讲述了PHP的反射动态获取类方法.属性.参数操作.分享给大家供大家参考,具体如下: 我们可以在PHP运行时,通过PHP的反射动态的获取类的方法.属性.参数等详细信息. 用途:插件的设计,文档的自动生成,扩充PHP语言. <?php class Person { const weightUnit = 'kg'; const heightUnit = 'cm'; public $name = 'test'; public $age = 1; public function say($msg

  • Javascript获取CSS伪元素属性的实现代码

    CSS伪元素非常强大,它经常被用来创建CSS三角形提示,使用CSS伪元素可以实现一些简单的效果但又不需要增加额外的HTML标签.有一点就是Javascript无法获取到这些CSS属性值,但现在有一种方法可以获取到: 看看下面的CSS代码: .element:before { content: 'NEW'; color: rgb(255, 0, 0); }.element:before { content: 'NEW'; color: rgb(255, 0, 0); } 为了获取到.element

  • js简单遍历获取对象中的属性值的方法示例

    本文实例讲述了js简单遍历获取对象中的属性值的方法.分享给大家供大家参考,具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <

  • js获取form表单中name属性的值

    在项目中因为动态表单无法确定标签name属性的值,因此需要即时获取以便进行存储.前端代码如下: <div class="control-group"> <label class="control-label">土拨鼠常挖坑</label> <form:input path="formAttribute1" class="input-xlarge" value=""

  • Spring实战之获取其他Bean的属性值操作示例

    本文实例讲述了Spring实战之获取其他Bean的属性值操作.分享给大家供大家参考,具体如下: 一 配置 <?xml version="1.0" encoding="GBK"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xml

随机推荐