当遇到复杂多表查询时,并且同时还需要确保查询性能,此时则需要使用自定义sql查询,然而spring data jpa对于自定义sql则需使用查询需要在对应的bean中做太多的配置映射,我尝试了一下,最终还是没成功。故选择了另一种方式来解决。

     String sql = "select a.name,b.className,a.createTime from A a left join B b on a.id = b.id";
     Query query = entityManager.createNativeQuery(sql);
    //此方法是将数据集合转换位map类型的List集合
    //query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(HashMap.class));
List<Object[]> resultList = query.getResultList();
List<MyEntity> list = CommonUtils.castEntity(resultList, MyEntity.class);

使用entityManage创建nativeQuery,此时获取到的结果集返回的数据是 List<Object[]> 类型的,由于我所需要的字段仅只有name,className,createTime,故构造对应的bean。

public class MyEntity {

    private String name;

    private String className;

    private Long createTime;

    public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getClassName() {
return className;
} public void setClassName(String className) {
this.className = className;
} public Long getCreateTime() {
return createTime;
} public void setCreateTime(Long createTime) {
this.createTime = createTime;
}
  //必须构建的构造方法,含有查询列所有的对应的字段
public MyEntity(String name, String className, BigInteger createTime) {
this.name = name;
this.className = className;
this.createTime = createTime != null ? createTime.longValue() : null ;
} public MyEntity() {
}
}

由于数据库中createTime保存的是Long型,发现用 entityManager 获取到的是 BigInteger ,故构造方法的参数类型设为BigInteger,是为了便于数据做转换。

/**
* 数组集合转化为指定对象集合
* 指定的实体对象必须包含所以字段的构造方法,数组的元素的顺序将和构造方法顺序和类型一一对应
* @param list
* @param clazz
* @param <T>
* @return
* @throws Exception
*/
public static <T> List<T> castEntity(List<Object[]> list, Class<T> clazz) throws Exception {
List<T> 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<T> constructor = clazz.getConstructor(c2);
returnList.add(constructor.newInstance(o));
} return returnList;
}

上面方法则是对数据进行了转换,通过反射构造方法进行实例化对象。返回目标类型的List集合。

最新文章

  1. async &amp; await 的前世今生(Updated)
  2. 移植一个cocos2d-x游戏
  3. CSS3 莲花盛开动画
  4. Android中的适配方式
  5. 解决redhat的未注册问题
  6. easyui 获得父级tabs跳转
  7. copy 和 strong(或retain)的区别
  8. POJ 2777 Count Color(线段树染色,二进制优化)
  9. hiveserver2以及beeline客户端的使用
  10. iOS面试必看,最全梳理
  11. 传递闭包(Floyd+bellman-Fold POJ1932)
  12. 怎么解决ABBYY找不到_FRBatch.pac的问题
  13. Get-ChildItem参数之 -Exclude,Filter,Recurse应用
  14. WCF开发时如何选择正确的实例模式(InstanceMode)?
  15. Javascript操作阵列
  16. 跳转到设置页面 与appstory
  17. SQL Server 2012 案例教程(贾祥素)——学习笔记
  18. 看完给跪了:技术大牛总结的Github与华为软件开发云完整对比
  19. 在.csproj文件中增加npm, bower, gulp, webpack的构建
  20. vi设置行号

热门文章

  1. shell变量数学运算
  2. Java安装
  3. JS判断客户端、浏览器、操作系统
  4. css伪元素用法大全
  5. 连连看的原生JS实现
  6. YoMail 邮箱客户端的社会化之路,起于邮箱,不止于邮件
  7. 了解 : angular controller link ng-init 顺序
  8. 第八讲:I/O虚拟化
  9. Spark_总结四
  10. 深入理解 JavaScript 异步系列(1)—— 什么是异步