博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Data JPA |自定义非实体类的映射
阅读量:4180 次
发布时间:2019-05-26

本文共 3257 字,大约阅读时间需要 10 分钟。

一、首先是实体类的定义:

package com.example.entity;import lombok.*;import javax.persistence.*;import java.io.Serializable;/** * @author xiaobu * @version JDK1.8.0_171 * @date on  2018/11/13 10:51 * @description V1.0 */@Entity@Table(name = "test_book")@NoArgsConstructor@Setter@Getter@ToStringpublic class Book implements Serializable {    private static final long serialVersionUID = 6214167880862325845L;    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private int id;    @Column(name="name",columnDefinition=("varchar(50)  default null comment '名称'"))    private String name;    @Column(name="author",columnDefinition=("varchar(252)  default null comment '作者'"))    private String author;}

二、自定义非实体类的定义:

package com.example.entity.vo;import lombok.Getter;import lombok.NoArgsConstructor;import lombok.Setter;import lombok.ToString;import java.io.Serializable;/** * @author xiaobu * @version JDK1.8.0_171 * @date on  2018/11/16 10:05 * @description V1.0 */@Getter@Setter@ToStringpublic class BookVo implements Serializable {    private static final long serialVersionUID = 294655766971777057L;    public BookVo (String name, String author) {        super();        this.name = name;        this.author = author;    }    private String name;    private String author;}

三、使用HQL方式查询:

List
list = bookRepository.findByHql("select new com.example.entity.vo.BookVo (b.name,b.author) from Book b");

四、使用SQL方式查询(需要把结果通过反射转为对应的自定义的非实体类)

List
list1 = bookRepository.findListBySql("select b.name,b.author from test_book b"); for(Object[] objects:list1){ System.out.println(Arrays.toString(objects)); } List
vos = EntityUtils.castEntity(list1,BookVo.class); System.out.println(vos);

五、EntityUtils工具类的内容如下:

package com.example.util;import lombok.extern.slf4j.Slf4j;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/** * @author xiaobu * @version JDK1.8.0_171 * @date on  2018/11/16 11:06 * @description V1.0 */@Slf4jpublic class EntityUtils {    /**     * 数组集合转化为指定对象集合     * 指定的实体对象必须包含所以字段的构造方法,数组的元素的顺序将和构造方法顺序和类型一一对应     *     * @param list  集合     * @param clazz c     * @param 
类型 * @return List
*/ public static
List
castEntity(List
list, Class
clazz) { List
returnList = new ArrayList<>(); if (list.size() == 0) { return returnList; } Class[] c2 = null; Constructor[] constructors = clazz.getConstructors(); for (Constructor constructor : constructors) { Class[] tClass = constructor.getParameterTypes(); if (tClass.length == list.get(0).length) { c2 = tClass; break; } } //构造方法实例化对象 for (Object[] o : list) { Constructor
constructor = null; try { constructor = clazz.getConstructor(c2); } catch (NoSuchMethodException e) { e.printStackTrace(); } try { assert constructor != null; returnList.add(constructor.newInstance(o)); } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } } return returnList; }}

六、查询的字段名须和实体的属性一一对应

转载地址:http://fygai.baihongyu.com/

你可能感兴趣的文章
Linux之父警告全球程序员:我刚发布的5.12内核有bug,你们千万别用
查看>>
IDEA公司真牛逼,发行最适合程序员编程字体~
查看>>
闲鱼 12 块买的软件资源!禁止贩卖赚钱
查看>>
刷LeetCode算法题的常见模式套路
查看>>
GitHub 标星8.6K:将任何设备转换为电脑的辅助屏幕
查看>>
955 互联网公司白名单来了!这些公司月薪20k,没有996!福利榜国内大厂只有这家!...
查看>>
这种古法制作CPU,看第一眼就被震撼到了
查看>>
注意!某知名国产软件被曝携带木马病毒
查看>>
为什么我建议你一定要学Python?
查看>>
哈哈哈哈哈哈…发现微信一个bug!有点好玩~
查看>>
B 站,真香 ! ! !
查看>>
我是如何放弃 JSP,转向 REST 编程的
查看>>
阿里二面:什么是mmap?
查看>>
收到字节 Offer,月薪 45k,爽!
查看>>
计算机科学界至今未解决的四大难题
查看>>
程序员离职后躲老家山洞 2 年,敲出 45 万行代码...
查看>>
7 面 Google,还是失败了....
查看>>
技术大佬们都是怎么学习的?
查看>>
45 年编程经验告诉我的技术真相
查看>>
Python除了不能帮你生孩子,什么都能做!
查看>>