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;
}
}