SpringBoot框架中JPA使用的一些问题
主要是自己在使用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使用的一些问题的更多相关文章
- springboot框架中集成thymeleaf引擎,使用form表单提交数据,debug结果后台获取不到数据
springboot框架中集成thymeleaf引擎,使用form表单提交数据,debug结果后台获取不到数据 表单html: <form class="form-horizontal ...
- Springboot框架中request.getInputStream()获取不到上传的文件流
Springboot框架中用下面的代码,使用request.getInputStream()获取不到上传的文件流 @PostMapping("/upload_img") publi ...
- 工作流中的数据持久化详解!Activiti框架中JPA的使用分析
Activiti中JPA简介 可以使用JPA实体作为流程变量, 并进行操作: 基于流程变量更新已有的JPA实体,可以在用户任务的表单中填写或者由服务任务生成 重用已有的领域模型,不需要编写显示的服务获 ...
- springboot框架中的各种 注解
使用注解的优势: 1.采用纯java代码,不在需要配置繁杂的xml文件 2.在配置中也可享受面向对象带来的好处 3.类型安全对重构可以提供良好的支持 4.减少复杂配置文件的同时亦能享受到springI ...
- SpringBoot框架中,使用过滤器进行加密解密操作(一)
一.基本说明 1.请求方式:POST请求.注解@PostMapping 2.入参格式:json串 3.出参格式:json串(整体加密) 4.使用Base64进行加密解密.具体的加密方式,可以根据需求自 ...
- 在SpringBoot框架中使用拦截器
1.继承WebMvcConfigureAdapter类,覆盖其addInterceptors接口,注册我们自定义的拦截器 package com.eth.wallet.config; import c ...
- SpringBoot框架中解决日期展示问题
解决日期展示问题(返回的json中日期的格式是:"birthday":"1988-08-07T15:00:00.000+0000");需要转化成指定的格式(年月 ...
- 在前后端分离的SpringBoot项目中集成Shiro权限框架
参考[1].在前后端分离的SpringBoot项目中集成Shiro权限框架 参考[2]. Springboot + Vue + shiro 实现前后端分离.权限控制 以及跨域的问题也有涉及
- SpringBoot中JPA的学习
SpringBoot中JPA的学习 准备环境和项目配置 写一下学习JPA的过程,主要是结合之前SpringBoot + Vue的项目和网上的博客学习一下. 首先,需要配置一下maven文件,有这么两个 ...
随机推荐
- Angular开发实践(二):HRM运行机制
引言 在angular-start项目中启用了模块热替换(HMR - Hot Module Replacement)功能,关于如何在angular-cli启用HRM,请查看HRM配置 那HMR是个什么 ...
- 使用guava实现找回密码的tokenCache以及LRU算法
源码包的简单说明: com.google.common.annotations:普通注解类型. com.google.common.base:基本工具类库和接口. com.google.common. ...
- GEETEST极验召集互联网大佬齐聚光谷,共同探讨交互安全问题
全球互联网技术在飞速发展的同时,网络安全事件也随之频发.除了直接带来经济损失的网络恶意攻击之外,企业在多个方面也遭受着不同程度的网络恶意攻击,包括品牌形象.管理时间.企业竞争力.客户成交量.用户行为等 ...
- windows下安装Virtualenvwrapper
windows下安装Virtualenvwrapper 我们可以使用Virtualenvwrapper来方便地管理python虚拟环境,但是在windows上安装的时候.....直接 install ...
- AngularJS应用,常用数组知识点
AngularJS 1:ng-click,ng-model,ng-bind,ng-class,ng-hide,ng-app 2:placeholder, 3:{}中加入代码“:true|false”, ...
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- SpringBoot集成redis的key,value序列化的相关问题
使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...
- Webpack结合ES6
一.概述ES6现在正是风华正茂的时候,各个公司都是 尝试去使用,并且作为前端工程师ES6也是体现技术的亮点.但是,现在的浏览器对es6支持不是 特别的兼容,最终还是需要把es6转换为es5,webpa ...
- 基于hi-nginx的web开发(python篇)——表单处理和文件上传
hi-nginx会自动处理表单,所以,在hi.py框架里,要做的就是直接使用这些数据. 表单数据一般用GET和POST方法提交.hi-nginx会把这些数据解析出来,放在form成员变量里.对pyth ...
- java设计模式------建造者模式
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 类图 描述 Builder:定义一个建造者抽象类,以规范产品对象的各个组成部分的建造.这个接口 ...