主要是自己在使用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. OpenStack中部署glance的步骤

    OpenStack中部署glance的步骤(基于Ubuntu14.04系统) author:headsen  chen   2017-10-13   08:34:35 个人原创,转载请注明作者,出处, ...

  2. jQuery学习笔记之extend方法小结

    在学习jQuery的时候,学习到了$.extend的主要用法,在此做一个简单的总结. (1)当只写一个对象自变量时,拓展的是jQuery的工具方法,如: $.extend({ aaa:function ...

  3. xampp配置多端口访问

    1.修改D:\xampp\apache\conf\extra中的httpd-vhosts.conf文件,在最底部添加 <VirtualHost *:8080> ##需要监听的端口号 Ser ...

  4. poj-1207 THE 3n+1 problem

    Description Problems in Computer Science are often classified as belonging to a certain class of pro ...

  5. 【highlight.js】页面代码高亮插件

    [highlight.js] 很多博客都支持页面插入各种语言的代码,而这些代码肯定是有高亮设置的.那么在我们自己的页面上如何进行代码高亮设置?有现成的这个highlight.js插件我们可以使用. h ...

  6. 19.C++-(=)赋值操作符、智能指针编写(详解)

    (=)赋值操作符 编译器为每个类默认重载了(=)赋值操作符 默认的(=)赋值操作符仅完成浅拷贝 默认的赋值操作符和默认的拷贝构造函数有相同的存在意义 (=)赋值操作符注意事项 首先要判断两个操作数是否 ...

  7. DB2开发系列之三——SQL函数

    1.内置函数分类(SYSIBM模式内) 1)标量函数:返回一个标量值的函数: 2)聚合函数:也叫列函数,也返回一个标量值,这个值是一组输入值的计算结果:3)表函数:向引用它的 SQL 语句返回一个表: ...

  8. vue-过渡动画

    本篇资料参考于官方文档: http://cn.vuejs.org/guide/transitions.html 概述: Vue 在跳转页面时,提供多种不同方式的动画过渡效果. ●in-out:新元素先 ...

  9. c# 实时监控数据库 SqlDependency

    http://blog.csdn.net/idays021/article/details/49661855 class Program { private static string _connSt ...

  10. u3d材质Tiling和Offset意义以及TRANSFORM_TEX

    1. TRANSFORM_TEX主要作用是拿顶点的uv去和材质球的tiling和offset作运算, 确保材质球里的缩放和偏移设置是正确的 下面这两个函数是等价的.o.uv =   TRANSFORM ...