方法1:

 1 StringBuffer sb = new StringBuffer(300);
2 sb.append("SELECT v.id, v.container_number, v.error_feedback,v.is_handled,v.job_type,v.remark,v.vessel_voyage_number,");
3 sb.append("e.error_code,e.error_description");
4 sb.append(" FROM vessel_container_error v");
5 sb.append(" JOIN error e ON e.error_id = v.error_id");
6 sb.append(" where v.vessel_voyage_number = '").append(vesselVoyageNumber).append("' and v.container_number = '").append(containerNumber).append("'");
7 sb.append(" and v.job_type = '").append(jobType).append("' and is_handled = 0");
8
9 List<Object[]> re = this.vesselContainerErrorRespository.listBySQL(sb.toString());
10 List<VesselContainerErrorsBean> list = new ArrayList<>();
11 re.forEach(
12 objects -> {
13 VesselContainerErrorsBean errorsBean = new VesselContainerErrorsBean();
14 errorsBean.setId(objects[0] == null ? 0 : (int) objects[0]);
15 errorsBean.setContainerNumber(objects[1] == null ? "" : objects[1].toString());
16 errorsBean.setErrorFeedback(objects[2] == null ? "" : objects[2].toString());
17 errorsBean.setHandled(objects[3] == null ? false : (Boolean) objects[3]);
18 errorsBean.setJobType(objects[4] == null ? "" : objects[4].toString());
19 errorsBean.setRemark(objects[5] == null ? "" : objects[5].toString());
20 errorsBean.setVesselVoyageNumber(objects[6] == null ? "" : objects[6].toString());
21 errorsBean.setErrorCode(objects[7] == null ? "" : objects[7].toString());
22 errorsBean.setErrorDescription(objects[8] == null ? "" : objects[8].toString());
23 list.add(errorsBean);
24 }
25 );

优点:

1. 原生Sql , 可以使用数据库自带的方法

2. 适应不定查询条件数量的情况

缺点:

1. 读出来的是 List<Ojbect[]> , 数据转换时要人工对数组下标,判 null

方法2:

 1 StringBuilder countSelectSql = new StringBuilder(300);
2 countSelectSql.append("select count(*) ");
3
4 StringBuilder selectSql = new StringBuilder(500);
5 selectSql.append("select new net.pingfang.yard.core.domain.bo.JobPlanAndInsAndEquBO(");
6 selectSql.append("i.id,i.containerNumber,i.isoCode,i.originalPositionType,i.originalPositionValue,");
7 selectSql.append("i.targetPositionType,i.targetPositionId,i.targetPositionValue,i.instructionStatusCode,i.planStart,i.actualStart,i.createBy,i.equipmentId,");
8 selectSql.append("j.jobPlanCode,j.jobTypeCode)");
9
10 StringBuilder fromSql = new StringBuilder(250);
11 fromSql.append(" from InstructionEntity i join JobPlanEntity j on i.jobPlanId = j.id");
12
13 StringBuilder whereSql = new StringBuilder();
14 whereSql.append(" where j.jobPlanCode = :jobPlanCode");
15
16 Map<String, Object> params = new HashMap<>();
17 params.put("jobPlanCode", jobPlanCode);
18
19 if (!StringUtils.isEmpty(containerNumber)) {
20 whereSql.append(" and i.containerNumber = :containerNumber");
21 params.put("containerNumber", containerNumber);
22 }
23 if (!StringUtils.isEmpty(equipmentCode)) {
24 fromSql.append(" join EquipmentEntity e on i.equipmentId = e.id");
25 whereSql.append(" and e.equipmentCode = :equipmentCode");
26 params.put("equipmentCode", equipmentCode);
27 }
28 if (null != instructionStatusCode && !instructionStatusCode.isEmpty()) {
29 whereSql.append(" and i.instructionStatusCode in :instructionStatusCode");
30 params.put("instructionStatusCode", instructionStatusCode);
31 }
32
33 int total = this.getTotalByHql(countSelectSql.append(fromSql).append(whereSql).toString(), params);
34 PageBean page = new PageBean(total, pageNumber, pageSize);
35 if (total > 0) {
36 List<JobPlanAndInsAndEquBO> result = this.searchByHql(selectSql.append(fromSql).append(whereSql).toString(), JobPlanAndInsAndEquBO.class, params, pageNumber, pageSize);
37 page.setContent(result.stream().map(this::toJobPlanAndInsAndEquDTO).collect(Collectors.toList()));
38 }

优点:

1. Hql, 没有使用 JPA  , 而是使用了 EntityManager

2. 适应不定查询条件数量的情况

3. 解决了方法1的缺点

缺点:

1. 解决了方法1 中 List<Ojbect[]> 的问题,但也产生了一个要注意的地方,select 后面使用了一个 POJO 把从数据库读出来的属性包起来了

  1.1 POJO里面构造函数的参数的顺序与从数据库读出来的属性的顺序要一一对应

  1.2 select 后面的 POJO 要写全路径

方法3:

1 @Query(value = "select i.targetPositionId as wagonId,sum(c.containerSize) as containerSize" +
2 " from InstructionEntity i join ContainerDetailEntity c on i.containerId = c.id" +
3 " where i.instructionStatusCode <> 'done' and i.targetPositionType = 'train' and i.targetPositionId = ?1" +
4 " group by i.targetPositionId")
5 ContainersInWagonInterface findInstructionByWagonId(int wagonId);
1 public interface ContainersInWagonInterface extends ContainersInterface {
2
3 Integer getWagonId();
4 String getWagonNumber();
5 }

优点:

1. 这种方法返回是个接口,也可以是接口的列表,属性的顺序不要求与接口中的属性顺序一致

缺点:

1. hql 语句 select 后面的属性必须使用别名且与接口里的方法名一致

2. hql 读出来的属性可能为 null , 使用时要 判 null

3. 适用于查询条件数量固定的情况 , 条件数量不固定推荐使用 方法2

方法1是我以前常用的方法,方法2和方法3 是最近用到的,个人感觉比方法1好多,这里作个记录。当然 JPA 自带其它方法可以解决 sql 级联查询的问题,如标签 @onetomany 、@manytomany 。若不需要级联查询,用 JPA提供的方法就足够了。

Spring boot JPA读取数据库方法的更多相关文章

  1. # spring boot + mybatis 读取数据库

    spring boot + mybatis 读取数据库 创建数据库 use testdb; drop table if exists t_city; create table t_city( id i ...

  2. Spring Boot+Jpa(MYSQL)做一个登陆注册系统(前后端数据库一站式编程)

    Spring Boot最好的学习方法就是实战训练,今天我们用很短的时间启动我们第一个Spring Boot应用,并且连接我们的MySQL数据库. 我将假设读者为几乎零基础,在实战讲解中会渗透Sprin ...

  3. Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题

      (转载)Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题   这几天在用spring boot开发项目, 在开发的过程中遇到一个问题hibernate在执 ...

  4. Spring boot Jpa添加对象字段使用数据库默认值

    Spring boot Jpa添加对象字段使用数据库默认值 jpa做持久层框架,项目中数据库字段有默认值和非空约束,这样在保存对象是必须保存一个完整的对象,但在开发中我们往往只是先保存部分特殊的字段其 ...

  5. spring cloud spring boot JPA 克隆对象修改属性后 无法正常的执行save方法进行保存或者更新

    2019-12-1220:34:58 spring cloud spring boot JPA 克隆对象修改属性后 无法正常的执行save方法进行保存或者更新 未解决

  6. Spring Boot JPA 连接数据库

    本文将介绍怎样在Spring Boot project中加入JPA作为持久化方式. 改动 pom.xml 依赖 与上一篇介绍的 jdbc 不同的是 spring-boot-starter-jdbc 改 ...

  7. Spring Boot JPA 中transaction的使用

    文章目录 @Transactional的实现 @Transactional的使用 Transaction的传播级别 REQUIRED SUPPORTS MANDATORY NEVER NOT_SUPP ...

  8. Spring Boot实战之数据库操作

    上篇文章中已经通过一个简单的HelloWorld程序讲解了Spring boot的基本原理和使用.本文主要讲解如何通过spring boot来访问数据库,本文会演示三种方式来访问数据库,第一种是Jdb ...

  9. Spring Boot(二):数据库操作

    本文主要讲解如何通过spring boot来访问数据库,本文会演示三种方式来访问数据库,第一种是JdbcTemplate,第二种是JPA,第三种是Mybatis.之前已经提到过,本系列会以一个博客系统 ...

随机推荐

  1. MyBatis if 标签的坑,居然被我踩到了。。。

    事件的原因是这样的,需求是按条件查数据然后给前端展示就行了,写的时候想着挺简单的,不就是使用 MyBatis 动态 SQL 去查询数据吗? 现实还是很残酷的,等我写完上完 UAT 后,前端同学说根据s ...

  2. 深入剖析HashMap

    前言 很高兴遇见你~ HashMap是一个非常重要的集合,日常使用也非常的频繁,同时也是面试重点.本文并不打算讲解基础的使用api,而是深入HashMap的底层,讲解关于HashMap的重点知识.需要 ...

  3. PCANBasic开发(二)

    使用Peak的PCan转换器开发,使用其中的PCanBasic.dll // PCANBasic.cs // // ~~~~~~~~~~~~ // // PCAN-Basic API // // ~~ ...

  4. 配置nginx支持THINKPHP的PATH_INFO

    ThinkPHP支持通过PATHINFO和URL rewrite的方式来提供友好的URL,但是Nginx中默认是不支持PATHINFO的,所以我们需要修改nginx.conf文件. location ...

  5. CentOS 7 mini版本安装后必须要做的几件事

    Linux家族非常的庞大,诸如Debian.Ubuntu.RedHat.CentOS.ArchLinux.Gentoo,甚至还有国内比较有名的Deepin,都是Linux家族闪耀的明星.根据实际需求涉 ...

  6. [日常摸鱼]bzoj2463 [中山市选2009]谁能赢呢?

    题意:两个人在$n*n$的棋盘上玩游戏,一开始棋子在左上角,可以上下左右的走到没有走过的地方,最后不能走的那个输,两个人都采取最优决策问哪个赢 猜结论!$n$为偶数则先手赢,否则后手赢. 考虑用$1* ...

  7. css做keylogger

    下载keylogger:https://github.com/maxchehab/css-keylogging 参考讲解:https://blog.csdn.net/weixin_34138139/a ...

  8. 【Idea插件】kotlin的orm框架一键生成代码框架

    @font-face { font-family: octicons-link; src: url("data:font/woff;charset=utf-8;base64,d09GRgAB ...

  9. 彻底理解Hive中的锁

    前面遇到过一次因为Hive中表被锁住了,导致定时任务一直失败.这两天又出现了表被锁,原因是连接hiveserver2过于频繁,mysql连接被打满,引发的连锁反应,导致我们的小时任务一直失败,下午重点 ...

  10. k8s的kube-proxy

    kube-proxy 运行在每个节点上,监听 API Server 中服务对象的变化,再通过管理 IPtables 来实现网络的转发. Kube-Proxy 不同的版本可支持三种工作模式:   Use ...