iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何使用JPA自定义VO类型转换
  • 833
分享到

如何使用JPA自定义VO类型转换

2023-06-25 17:06:15 833人浏览 安东尼
摘要

这篇文章主要介绍如何使用JPA自定义VO类型转换,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!JPA自定义VO类型转换(EntityUtils工具类)在JPA查询中,如果需要返回自定义的类,可以使用EntityUti

这篇文章主要介绍如何使用JPA自定义VO类型转换,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

JPA自定义VO类型转换(EntityUtils工具类)

在JPA查询中,如果需要返回自定义的类,可以使用EntityUtils工具类,该类源码

import org.slf4j.Logger;import org.slf4j.LoggerFactory; import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map; public class EntityUtils {     private static final Logger log = LoggerFactory.getLogger(EntityUtils.class);         public static <T> List<T> castEntity(List<Object[]> list, Class<T> clazz, Object model) {        List<T> returnList = new ArrayList<T>();        if (list.isEmpty()) return returnList;        Object[] co = list.get(0);        List<Map> attributeInfoList = getFiledsInfo(model);        Class[] c2 = new Class[attributeInfoList.size()];        if (attributeInfoList.size() != co.length) {            return returnList;        }        for (int i = 0; i < attributeInfoList.size(); i++) {            c2[i] = (Class) attributeInfoList.get(i).get("type");        }        try {            for (Object[] o : list) {                Constructor<T> constructor = clazz.getConstructor(c2);                returnList.add(constructor.newInstance(o));            }        } catch (Exception ex) {            log.error("实体数据转化为实体类发生异常:异常信息:{}", ex.getMessage());            return returnList;        }        return returnList;    }     private static Object getFieldValueByName(String fieldName, Object modle) {        try {            String firstLetter = fieldName.substring(0, 1).toUpperCase();            String getter = "get" + firstLetter + fieldName.substring(1);            Method method = modle.getClass().getMethod(getter, new Class[]{});            Object value = method.invoke(modle, new Object[]{});            return value;        } catch (Exception e) {            return null;        }    }     private static List<Map> getFiledsInfo(Object model) {        Field[] fields = model.getClass().getDeclaredFields();        List<Map> list = new ArrayList(fields.length);        Map infoMap = null;        for (int i = 0; i < fields.length; i++) {            infoMap = new HashMap(3);            infoMap.put("type", fields[i].getType());            infoMap.put("name", fields[i].getName());            infoMap.put("value", getFieldValueByName(fields[i].getName(), model));            list.add(infoMap);        }        return list;    } }

使用原生sql查询:

    @Query(value = "select id, position, salary, people, experience, address, update_time from employment_position where company_name = ?1 and is_delete is false ORDER BY sort asc", nativeQuery = true)    List<Object[]> findByCompanyName(String name);

使用类型转换:

@Override    public List<EmploymentPositionVO> findByCompanyName(String name) {        List<Object[]> objects = employmentPositionRepository.findByCompanyName(name);        return EntityUtils.castEntity(objects, EmploymentPositionVO.class, new EmploymentPositionVO());    }

VO类如下:

import lombok.Data; import java.math.BigInteger;import java.sql.Timestamp; @Datapublic class EmploymentPositionVO {         private BigInteger id;         private String position;         private String salary;         private Integer people;         private String experience;         private String address;         private Timestamp updateTime;     public EmploymentPositionVO(BigInteger id, String position, String salary, Integer people, String experience, String address, Timestamp updateTime) {        this.id = id;        this.position = position;        this.salary = salary;        this.people = people;        this.experience = experience;        this.address = address;        this.updateTime = updateTime;    }     public EmploymentPositionVO() {    }}

注意!

查询sql语句所查询出来的字段应与VO类中属性顺序一致,类型也需要一致!!

例如ID这个字段MySQL中类型为bigint,VO类中的类型为bigInteger

dto,vo,po,bo等实体转换工具类

3层开发以及不是多么新颖的开发思想了,但是呢,苦于开发的程序猿们,经常会被各个实例之间的转换弄得晕头转向,尤其是转换的次数多了,一下就蒙了,不知道转到哪里去了,博主也有这种困难,于是在网上到处找,找到了一些方法,并结合自身的开发使用,填补一些坑,希望对大家有所帮助!

下面宣布这次的主角:dozer

他是谁,一看英文名就不懂吧,其实他是一个大家都知道的一个角色,spring里面他可是家喻户晓的一个主角,没错就是beanUtils(其实,就是他的替身!)主要作用就是用来复制 JavaBean 属性的类库,什么叫复制,没错,就一模一样的再来一份,但是这样有一点点小小的区别,那就是,在使用的时候,需要指定一个“容器”(瞎说的,就是一个映射接受对象,也可以叫做目标)来存放,不然,复制到哪去,是不是。

这个时候呀,就有一个经纪人的出现,需要通过“经纪人”去代理复制,才能叫这个替身出来呀(专业替身30年,必须要有经纪人)

<dependency>    <groupId>net.sf.dozer</groupId>    <artifactId>dozer</artifactId>    <version>5.5.1</version></dependency>

好了,经纪人的名片已经发出,这个时候,找到剧组,咱们看看这个替身能不能胜任,能应用在哪些剧组,哪些场景!

第一种场景,完全一样:(咦,度一样了,那肯定好弄,又看不出来区别)

在各个实体是一样的情况下,是很容易的,直接上不就行啦,也不用做啥处理是不是:

直接是用原始替身(api方法)

 Mapper mapper = new DozerBeanMapper();DestinationObject destObject =      mapper.map(sourceObject, DestinationObject.class);

嘿嘿,换一下衣服,直接OK了(也就是使用mapper转换复制)

第二种场景,完全不一样:

求乞,完全不一样,这咋的弄呀,肯定得换替身,是不是!最起码找个相似的嘛(不用担心,咱们有化妆师呀,化妆走起!)

@Datapublic class UserVo{    @Mapping("userName")    private String name;    @Mapping("passWord")    private String pwd;}

看一下,是不是这个东西,好眼熟,没错,是咱们的vo

@Data@TableName("user")public class UserEntity implements Serializable {    @ApiModelProperty(value = "id")    @TableId(value = "id", type = IdType.INPUT)    private String id;    @ApiModelProperty(value = "用户名")    @Mapping("name")    private String userName;    @ApiModelProperty(value = "密码")    @Mapping("pwd")    private String password;    @ApiModelProperty(value = "登录名")    private String loginName;    @ApiModelProperty(value = "创建时间")    private Date createTime;    @ApiModelProperty(value = "修改时间")    private Date updateTime;    @ApiModelProperty(value = "版本号")    private Integer version;    @ApiModelProperty(value = "作废标记")    private Integer deleted;}

这个呢,是咱们的实体对象(也就是数据库对象了)

看一下,是不是发小完全不一样呀!

这里呢,@Mappin充当了化妆品的角色,将每一个不同的细节进行遮盖,使其成为和原来的实例一模一样(也就是做了映射了)

 @Mapping("userName") private String name;

上面就是一个化妆处理,将name映射为userName

每一个地方处理完成后,直接上剧组,看看能不能不被发现

    @NonNull    public static <T> T convert(@NonNull Object source, @NonNull Class<T> clazz) {        return  dozerMapper.map(source, clazz);    }

实例:

 UserEntity userEntity = userMapper.selectOne(wrapper);            UserVo convert = null;            if(userEntity != null){               convert = Dozer.convert(userEntity, UserVo.class);            }

没错,这样就完成转换替身的操作了,结果是可以映射上的,各位可以试试哦!

第三种场景,一堆的不相同的替身(好难呀,一堆的不一样,不能找几个差不多的吗?)

针对于这种一堆的不一样的替身,dozer也有办法,通过JAVA8的stream流来进行化妆(化妆师牛,只能这么说)

     @Nullable    public static <T> List<T> convert(@Nullable List<?> source, @NonNull Class<T> clazz) {        return Optional.ofNullable(source)                .orElse(Collections.emptyList())                .stream()                .map(bean -> dozerMapper.map(bean, clazz))                .collect(Collectors.toList());    }

看见没,这样一弄,就OK了,咦,是不是发现化妆师dozerMapper从哪来的(这么牛的化妆师,召几个开化妆店去),博主告诉你,这个化妆师呀,并不是越多也好的(大家都知道,一样的对象,建立太多浪费空间),只需要建立一个全局唯一的就行了,博主带你们看一下化妆间就明白了(工具类来了)

package cn.yichehuoban.ycbb.platfORM.util.beanutils;import org.dozer.Mapper;import org.springframework.lang.NonNull;import org.springframework.lang.Nullable;import org.springframework.stereotype.Component;import java.util.Collections;import java.util.List;import java.util.Optional;import java.util.stream.Collectors; @Componentpublic class Dozer {        public static final Mapper dozerMapper = new org.dozer.DozerBeanMapper();        @NonNull    public static <T> T convert(@NonNull Object source, @NonNull Class<T> clazz) {        return  dozerMapper.map(source, clazz);    }        @Nullable    public static <T> List<T> convert(@Nullable List<?> source, @NonNull Class<T> clazz) {        return Optional.ofNullable(source)                .orElse(Collections.emptyList())                .stream()                .map(bean -> dozerMapper.map(bean, clazz))                .collect(Collectors.toList());    }}

在给大家看一下我们的替身

@Datapublic class UserVo{    @Mapping("userName")    private String name;    @Mapping("password")    private String pwd;    private String loginName;    private Integer version;    private Integer deleted;    private String id;}

一样的地方直接就映射上了,不一样的地方使用 @Mapping注解,填写上源指定对象的字段名就行。

以上是“如何使用JPA自定义VO类型转换”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 如何使用JPA自定义VO类型转换

本文链接: https://www.lsjlt.com/news/306149.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用JPA自定义VO类型转换
    这篇文章主要介绍如何使用JPA自定义VO类型转换,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!JPA自定义VO类型转换(EntityUtils工具类)在JPA查询中,如果需要返回自定义的类,可以使用EntityUti...
    99+
    2023-06-25
  • 使用JPA自定义VO类型转换(EntityUtils工具类)
    目录JPA自定义VO类型转换(EntityUtils工具类)dto,vo,po,bo等实体转换工具类下面宣布这次的主角:dozerJPA自定义VO类型转换(EntityUtils工具...
    99+
    2024-04-02
  • 如何使用mybatis自定义日期类型转换器
    本篇内容主要讲解“如何使用mybatis自定义日期类型转换器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用mybatis自定义日期类型转换器”吧!前言使用mybatis中的typeHan...
    99+
    2023-06-29
  • 如何使用JPA自定义VO接收返回结果集
    这篇文章主要介绍如何使用JPA自定义VO接收返回结果集,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!JPA自定义VO接收返回结果集(unwrap)JPA跟mybitis比较,简单的业务搜索是方便的,但是设计到复杂的S...
    99+
    2023-06-25
  • hibernate或jpa中使用AliasToBeanResultTransformer自定义类型转换ResultTransformer下划线转驼峰
    在Hibernate或JPA中使用`AliasToBeanResultTransformer`进行自定义类型转换时,可以通过以下步骤...
    99+
    2023-09-12
    jpa
  • Java中的BaseTypeHandler自定义类型转换器如何使用
    这篇文章主要介绍“Java中的BaseTypeHandler自定义类型转换器如何使用”,在日常操作中,相信很多人在Java中的BaseTypeHandler自定义类型转换器如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2023-06-30
  • 使用JPA自定义VO接收返回结果集(unwrap)
    目录JPA自定义VO接收返回结果集(unwrap)JPA返回自定义VOJPA自定义VO接收返回结果集(unwrap) JPA跟mybitis比较,简单的业务搜索是方便的,但是设计到复...
    99+
    2024-04-02
  • C#中如何实现自定义类型的转换
    在C#中,我们可以通过实现类型转换运算符(conversion operators)来自定义类型的转换。具体步骤如下: 创建一个自...
    99+
    2024-04-03
    C#
  • jpa如何使用@Column来定义字段类型
    这篇文章将为大家详细讲解有关jpa如何使用@Column来定义字段类型,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。jpa @Column定义字段类型columnDefinition 实在是比较万能,不好...
    99+
    2023-06-21
  • Java中的BaseTypeHandler自定义类型转换器的使用
    目录简述通用的类型转换器(存在一些问题)定制类型转换器简述 mysq5.7之后新增了json类型,但是在使用的过程中,Json数组中的值小于Integer.MAX_VALUE,则反序...
    99+
    2024-04-02
  • springmvc怎么自定义类型转换器
    要自定义类型转换器,首先需要创建一个实现了Converter接口的转换器类,然后在Spring MVC的配置文件中注册这个转换器。 ...
    99+
    2024-04-02
  • 将自定义类型转换为基本类型指针
    php小编百草今天为大家介绍一个有关类型转换的重要概念——将自定义类型转换为基本类型指针。在编程中,我们经常需要将自定义类型转换为基本类型的指针,以便进行一些特定操作。这种转换操作可以...
    99+
    2024-02-09
  • 利用SpringMVC如何实现一个自定义类型转换器
    这篇文章将为大家详细讲解有关利用SpringMVC如何实现一个自定义类型转换器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。我们在使用SpringMVC时,常常需要把表单中的参数映射到我们对...
    99+
    2023-05-31
    springmvc 类型转换器
  • spring data jpa如何使用自定义repository实现类
    目录spring data jpa使用自定义repository实现类创建MyJpaRepository实现类创建MyJpaRepositoryFactoryBean配置JPAJpa...
    99+
    2024-04-02
  • C#类型转换之自定义隐式转换和显式转换
    目录前言基础知识示例代码实际应用问题答案报错其他应用和设计读音前言 有时我们会遇到这么一种情况:在json数据里,数组里的数据类型不一致,导致我们不能直接反序列化为目标类型。最终我们...
    99+
    2024-04-02
  • MyBatisPlus TypeHandler自定义字段类型转换Handler
    目录前言一、思考二、解决方式2.1、TypeHandler源码2.2、BaseTypeHandler 源码2.3、BigIntegerTypeHandler 源码中的实现类2.4、尝...
    99+
    2022-11-13
    MyBatisPlus字段类型转换 MyBatisPlus TypeHandler
  • Java怎么自定义强制类型转换
    在Java中,可以使用自定义方法来实现强制类型转换。下面是一个示例:```javapublic class MyClass {pub...
    99+
    2023-09-27
    Java
  • 怎么在Golang中转换自定义类型
    怎么在Golang中转换自定义类型?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。golang适合做什么golang可以做服务器端开发,但golang很适合做日志...
    99+
    2023-06-06
  • jpa使用@Column来定义字段类型
    目录jpa @Column定义字段类型jpa使用注解 设定字段类型为TEXT类型jpa @Column定义字段类型 columnDefinition 实在是比较万能,不好定义或者没有...
    99+
    2024-04-02
  • C#中怎么自定义类型转换函数
    C#中怎么自定义类型转换函数,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。/// <summary>  /// 将字符型...
    99+
    2023-06-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作