在spring-boot中一种综合查询的新想法

在实际的开发中,会遇到这样的问题:我们在综合查询中,接收到了很多个参数,比如:pageAllOfCurrentUserBySpecification(Long districtId, Long departmentId, String name, String code, Pageable pageable),此方法一般的,会被其它多个方法来调用来实现多种查询功能。但如果此方法一旦发生参数变更,那么其它调用它的方法就需要全部跟着变更一边。 示例代码: public void a(Integer a, Integer b, Integer c) { // 这里是大家统一调用的方法,单元测试的时候,只测试它即可 } public void b(Integer a, Integer b) { a(a, b, null); } public void c(Integer b, Integer c) { a(null, b, c); }此时,a方法发生变更,需要增加1个参数d。那么a,b,c三个方法全部要变一边. public void a(Integer a, Integer b, Integer c, Integer d) { // 这里是大家统一调用的方法,单元测试的时候,只测试它即可 } public void b(Integer a, Integer b) { a(a, b, null, null); } public void c(Integer b, Integer c) { a(null, b, c, null); }本文旨在探索一种方案来解决此类问题,当a方法的参数发生变更时,不影响其它调用此方法的方法。 ...

September 10, 2019 · 2 min · jiezi

JPA-查询问题探究

引言最近看到了实体图相关的博客,国外老哥说JPA的实体间关联会执行多次查询,当数据量大时性能非常差。 正好实体图在之前写华软的时候就学习过,只是没学明白,没在项目中实际应用,正好借此机会学习一下。 实践出真知,建一个jpa的项目,实际测试一下jpa到底是怎么查询的。 今日才发现,Spring Boot都更新到了2.1.5。 探究实体关系最简单的教务系统模型,教师、班级、学生。 基础数据两个教师,一个教师带俩班,一个班里俩学生。 单表查询Iterable<Teacher> teachers = teacherRepository.findAll();for (Teacher teacher : teachers) { System.out.println(teacher.getName());}最简单的查询语句,findAll之后获取name字段。 Hibernate: select teacher0_.id as id1_2_, teacher0_.name as name2_2_ from teacher teacher0_简单的单表查询,查出了基础字段id和name。 OneToMany多表关联查询Iterable<Teacher> teachers = teacherRepository.findAll();for (Teacher teacher : teachers) { System.out.println(teacher.getName()); for (Klass klass : teacher.getKlasses()) { System.out.println(klass.getName()); for (Student student : klass.getStudents()) { System.out.println(student.getName()); } }}看着挺普通的一段代码,大家应该都写过,其实里面大有学问。 测试环境org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.yunzhiclub.jpa.entity.Teacher.klasses, could not initialize proxy - no Session测试环境运行时报错,no session。 ...

May 30, 2019 · 1 min · jiezi

Mysql数据库的条件查询语句

对于分析人员来讲,Mysql数据库应用最多的是select查询语句,此篇文章主要介绍Mysql数据库的查询语句。一、单表查询1.带条件的查询基本语法:select * from +表名称 +where 条件;1)范围查询:eg:where 字段 between 10 and 100;2)模糊查询eg:where 字段 like’%不确定%‘备注:%代表多个字符,_下划线代表一个字符,^a代表以a为开头的数据,a$代表以a为结尾的数据,[abc]匹配所包含的任意一个字符。2.多条件查询备注:当and和or同时使用时,and优先级高于or。如果想要优先带or的条件,对带or部分条件带括号即可。3.排序基本语法:order by 字段。备注:默认是升序,ASC升序,DESC降序限制记录数:limit 1004.聚合函数count():统计记录数avg():平均数max():最大值min():最小值sum():求和5.分组基本语法:select 字段1,字段2,聚合函数 from +表名称 +group by 字段1,字段2备注:group by和having 一起使用,主要是对分组结果进行过滤二、多表关联查询1.内连接–>inner join内连接即等值连接,获取两个表中字段匹配关系的记录,可省略写成join,可理解成集合概念中的“交集”,关联字段同时存在与两表的记录。2.左连接–>left join左连接,获取左边主表的全部记录,即便右表没有对应的数据。3.右连接–>right join右连接,获取右边主表的全部记录,即便左表没有对应的数据。4.连接符–>unionunion用于连接两个以上的select语句的结果,将结果组合到一个结果集中,并删除重复数据基本语法:select 字段 from 表1 union [all|distinct] select 字段 from 表2备注:union 即为 union distinct;若为union all,即返回带重复数据的结果集;在使用union时,所选出的内容显示会以前面的表的字段名称命名。

February 26, 2019 · 1 min · jiezi