主要是自己在使用JPA框架时遇到的一个坑,拿出来分享一下

首先上一个简单JPA框架实体

public interface EnterpriseInfoDao extends JpaSpecificationExecutor<EnterpriseInfoEntity>, PagingAndSortingRepository<EnterpriseInfoEntity,String> {
}

JPA的运用我就不多说了网上搜一下都是,我就举一个一般的使用方法

public interface EnterpriseInfoDao extends JpaSpecificationExecutor<EnterpriseInfoEntity>, PagingAndSortingRepository<EnterpriseInfoEntity,String> {
  EnterpriseInfoEntity findByEnterpriseName(String name);
}

通过EnterpriseName找到对应的企业实体,EnterpriseName是实体中的一个字段,由于我们数据库企业名是唯一的,所以返回值就是单个实体

接下来我举例一个返回值不是企业实体的方法

public interface EnterpriseInfoDao extends JpaSpecificationExecutor<EnterpriseInfoEntity>, PagingAndSortingRepository<EnterpriseInfoEntity,String> {
  EnterpriseInfoEntity findByEnterpriseName(String name);
  @Query(value = "select pi.id,pi.name from person_info pi\n" +
"left join enterprise_info ei on ei.id = pi.belong_ent\n" +
"where ent.id in ?1\n" +
"and ei.id_deleted = ?2", nativeQuery = true)
  List<Object[]> findByEnterprise(List<String> entIds,Integer deleted);
}

我只是举个例子,不要问我为什么不写个personDao,只是举个例子

当你使用query写原生sql语句时,你返回的不是该Dao的对应实体的话,你需要将它的返回类型设置为List<Object[]>或者Object[]

这里我就遇到了一个坑,还遇到了2次,我就把它记录下来

一般来说对于这个List<Object[]>类型的返回值,在判空之后,循环拿出每个Object[]数组,然后ob[0]就是id,ob[1]就是name

但是如果在数据库中该企业下没有人员存在,那么这个坑就出现了

首先List不为空,它的大小为1,在object数组中,ob的length为1,它只有一个null,这个时候你去取ob[1]的时候系统就会报超出array大小的错误,原因就是这个。

我推荐的解决方案是直接在你的service中用jtbctemple的queryForList操作,它的返回值为List<Map<String,Object>>,即使object是null你也可以取到值,写个简单的例子

StringBuffer sb = new StringBuffer();
sb.append("select pi.id as id,pi.name as name from person_info pi\n" +
    "left join enterprise_info ei on ei.id = pi.belong_ent";
List<Map<String,Object>> extra = jdbcTemplate.queryForList(sb.toString());
if(!CollectionUnits.isEmpty(extra)){
  for(Map<String, Object> map: extra){
    String id = (String)map.get("id");
    String name = (String)map.get("name");
  }
}

SpringBoot框架中JPA使用的一些问题的更多相关文章

  1. springboot框架中集成thymeleaf引擎,使用form表单提交数据,debug结果后台获取不到数据

    springboot框架中集成thymeleaf引擎,使用form表单提交数据,debug结果后台获取不到数据 表单html: <form class="form-horizontal ...

  2. Springboot框架中request.getInputStream()获取不到上传的文件流

    Springboot框架中用下面的代码,使用request.getInputStream()获取不到上传的文件流 @PostMapping("/upload_img") publi ...

  3. 工作流中的数据持久化详解!Activiti框架中JPA的使用分析

    Activiti中JPA简介 可以使用JPA实体作为流程变量, 并进行操作: 基于流程变量更新已有的JPA实体,可以在用户任务的表单中填写或者由服务任务生成 重用已有的领域模型,不需要编写显示的服务获 ...

  4. springboot框架中的各种 注解

    使用注解的优势: 1.采用纯java代码,不在需要配置繁杂的xml文件 2.在配置中也可享受面向对象带来的好处 3.类型安全对重构可以提供良好的支持 4.减少复杂配置文件的同时亦能享受到springI ...

  5. SpringBoot框架中,使用过滤器进行加密解密操作(一)

    一.基本说明 1.请求方式:POST请求.注解@PostMapping 2.入参格式:json串 3.出参格式:json串(整体加密) 4.使用Base64进行加密解密.具体的加密方式,可以根据需求自 ...

  6. 在SpringBoot框架中使用拦截器

    1.继承WebMvcConfigureAdapter类,覆盖其addInterceptors接口,注册我们自定义的拦截器 package com.eth.wallet.config; import c ...

  7. SpringBoot框架中解决日期展示问题

    解决日期展示问题(返回的json中日期的格式是:"birthday":"1988-08-07T15:00:00.000+0000");需要转化成指定的格式(年月 ...

  8. 在前后端分离的SpringBoot项目中集成Shiro权限框架

    参考[1].在前后端分离的SpringBoot项目中集成Shiro权限框架 参考[2]. Springboot + Vue + shiro 实现前后端分离.权限控制   以及跨域的问题也有涉及

  9. SpringBoot中JPA的学习

    SpringBoot中JPA的学习 准备环境和项目配置 写一下学习JPA的过程,主要是结合之前SpringBoot + Vue的项目和网上的博客学习一下. 首先,需要配置一下maven文件,有这么两个 ...

随机推荐

  1. 深入浅出了解OCR识别票据原理(Applying OCR Technology for Receipt Recognition)

    原文:Applying OCR Technology for Receipt Recognition 译文:深入浅出了解OCR识别票据原理 英文票据识别技术, 非中文票据识别技术, 中文情况的ocr更 ...

  2. shell脚本之for循环

    shell脚本之for循环 author :headsen  chen       2017-10-18    09:50:41 个人原创,转载请注明.否则依法追究法律责任 1,cat forloop ...

  3. New Windows 10 SDK - Multi-instance UWP apps

    概述 前面一篇 About Windows 10 SDK Preview Build 17110 中,我们简单介绍了 Multi-instance UWP Apps,今天结合开发过程详细讲解一下. 在 ...

  4. 快速搭建CentOS+ASP.NET Core环境支持WebSocket

    环境:CentOS 7.x,.net core 2 以下.net core 2安装操作为官方方法.如果你使用Docker,那么更简单了,只需要docker pull microsoft/dotnet就 ...

  5. Oracle/Hive/Impala SQL比较1

    5 Function      指数据库内置的function,不讨论UDF.另外,操作符都不比较了,区别不大.   5.1 数学函数 功能 Oracle Hive Impala ABS 绝对值,有 ...

  6. 【Python】 魔法方法

    魔法方法 这个名字真的很中二有没有 = =(或者说翻译气息太浓了,作为一个学外语的看到这种真是想吐槽的不行..) 从形式上来说,在方法的名字前后个加上两条下划线的就是魔法方法了 .从功能上说,所有魔法 ...

  7. 3.Properties文件的加载和使用

    一.Properties简介 Properties 类继承自HashTable,提供的方法很像Map的实现类HashMap.它在 Java 编程的早期就有了,并且几乎没有什么变化.J2SE 的 Tig ...

  8. 启动tomcat时jmx port被占用

    一.问题描述 今天一来公司,在IntelliJ IDEA 中启动Tomcat服务器时就出现了如下图所示的错误: 错误: 代理抛出异常错误: java.rmi.server.ExportExceptio ...

  9. python全栈学习--day1

      计算机基础 CPU:中央处理器 内存:4GB,8GB,临时处理事务的地方,供给CPU数据. 硬盘:相当于电脑的数据库,存储着大量的数据,文件,电影等. 操作系统:执行者,支配所有关系 window ...

  10. linux小白成长之路10————SpringBoot项目部署进阶

    [内容指引] war包部署: jar包部署: 基于Docker云部署. 一.war包部署 通过"云开发"平台初始化的SpringBoot项目默认采用jar形式打包,这也是我们推荐的 ...