JPA 自定义映射

1. 创建 学生 ,教师表

CREATE TABLE `sys_student` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
 `username` varchar(11) DEFAULT NULL COMMENT '简称,网名',
 `teacher_id` int(11) DEFAULT NULL COMMENT '教师id',
 `gender` varchar(1) DEFAULT NULL COMMENT '性别',
 `delete_status` varchar(11) DEFAULT NULL COMMENT '删除标识符',
 `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
 `update_time` timestamp NULL DEFAULT NULL COMMENT '修改时间',
 `create_user` varchar(11) DEFAULT NULL COMMENT '创建人',
 `update_user` varchar(11) DEFAULT NULL COMMENT '修改人',
 PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用户信息表';
CREATE TABLE `sys_student` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
 `username` varchar(11) DEFAULT NULL COMMENT '简称,网名',
 `teacher_id` int(11) DEFAULT NULL COMMENT '教师id',
 `gender` varchar(1) DEFAULT NULL COMMENT '性别',
 `delete_status` varchar(11) DEFAULT NULL COMMENT '删除标识符',
 `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
 `update_time` timestamp NULL DEFAULT NULL COMMENT '修改时间',
 `create_user` varchar(11) DEFAULT NULL COMMENT '创建人',
 `update_user` varchar(11) DEFAULT NULL COMMENT '修改人',
 PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用户信息表';
INSERT INTO `sys_teacher`(`id`, `username`, `gender`, `delete_status`, `create_time`, `update_time`, `create_user`, `update_user`) VALUES (1, 'test_teacher', '0', '0', '2021-10-13 13:58:41', '2021-10-13 13:58:45', 'root', 'root');
INSERT INTO `sys_student`(`id`, `username`, `teacher_id`, `gender`, `delete_status`, `create_time`, `update_time`, `create_user`, `update_user`) VALUES (1, 'test', 1, '1', '0', '2021-10-12 17:22:46', '2021-10-12 17:22:49', 'root', 'root');

2 编写映射代码

映射实体类

@Data
public class StuVo implements Serializable{

    private static final long serialVersionUID = -490785821364938323L;
    private Long stuId;
    private String stuName;
    private Long teaId;
    private String teaName;
}

编写 service

        StringBuilder stringBuilder=new StringBuilder(" SELECT a.id stuId,a.username stuname,b.id teaId,b.username teaName FROM sys_student a  JOIN sys_teacher b on a.teacher_id=b.id WHERE a.id=:id");
        NativeQueryImplementor nativeQueryImplementor= (NativeQueryImplementor) entityManager.createNativeQuery(stringBuilder.toString()).setParameter("id",id);
      //  List<StuVo> list=nativeQueryImplementor.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(StuVo.class)).addScalar("stuId", LongType.INSTANCE).addScalar("stuName", StringType.INSTANCE).addScalar("teaName", StringType.INSTANCE).addScalar("teaId", LongType.INSTANCE).list();
        addScalar(nativeQueryImplementor,StuVo.class);
        List<StuVo> list=nativeQueryImplementor.list();
        

工具类方法

    private <T>void addScalar(NativeQueryImplementor nativeQueryImplementor,Class<T> clazz){
        if(nativeQueryImplementor!=null&&clazz!=null){
            nativeQueryImplementor.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(clazz));
            Map<String, PropertyDescriptor> map=BeanUtil.getPropertyDescriptorMap(clazz,false);
            Class<?> superClazz=clazz.getSuperclass();
            if(!Object.class.equals(superClazz)){
                map.putAll(BeanUtil.getPropertyDescriptorMap(superClazz,false));
            }
            if(!CollectionUtils.isEmpty(map)){
                map.forEach((key,value)->{
                    if(!"serialVersionUID".equals(key)){
                        nativeQueryImplementor.addScalar(key,getType(value.getPropertyType()));
                    }

                });
            }
        }else {
            throw new HibernateException("nativeQueryImplementor can not be null or clazz can not be null");
        }
    }
    private  <T>Type getType(Class<T> clazz){
        Type type=null;
        if(clazz==null){
            return StringType.INSTANCE;
        }else {
            if(clazz.equals(Long.class)){
                type=LongType.INSTANCE;
            }else if(clazz.equals(Integer.class)){
                type= IntegerType.INSTANCE;
            }else if(clazz.equals(Double.class)){
                type= DoubleType.INSTANCE;
            }else if(clazz.equals(Boolean.class)){
                type= BooleanType.INSTANCE;
            }else if(clazz.equals(Byte.class)){
                type= ByteType.INSTANCE;
            }else if(clazz.equals(Character.class)){
                type= CharacterType.INSTANCE;
            } else if(clazz.equals(Blob.class)){
                type= BlobType.INSTANCE;
            } else if(clazz.equals(Clob.class)){
                type= ClobType.INSTANCE;
            }else if(clazz.equals(Date.class)){
                type= DateType.INSTANCE;
            }else if(clazz.equals(Timestamp.class)){
                type= TimestampType.INSTANCE;
            }else {
                type=StringType.INSTANCE;
            }
            return type;
        }
    } 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值