SpringDataJPA - 复杂查询总结 (多表关联 以及 自定义分页 )
实体类
@Entity
@Table(name = "t_hotel")
@Data
public class THotel {
@Id
private int id;
private String name;
private String address;
/**
* 城市id
*/
private String city;
} @Entity
@Table(name = "t_city")
@Data
public class TCity {
@Id
private int id;
private String name;
private String state;
private String country;
private String map; }
新建接口
public interface TCityRepository extends JpaRepository<TCity, Integer>, JpaSpecificationExecutor<TCity> { }
单元测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class TCityRepositoryTest{ @Autowired
private TCityRepository tCityRepository;
}
1.查找出Id小于3,并且名称带有shanghai
的记录.
/**
* 查找出Id小于3,并且名称带有`shanghai`的记录.
*
* @param id id
* @param name 城市名称
* @return 城市列表
*/
List<TCity> findByIdLessThanAndNameLike(int id, String name);
单元测试
@Test
public void findByIdLessThanAndNameLike() throws Exception {
List<TCity> shanghai = tCityRepository.findByIdLessThanAndNameLike(3, "%shanghai%");
Assert.assertTrue(shanghai.size() > 0);
}
2.通过旅店名称分页查询旅店以及城市的所有信息
/**
* 通过旅店名称分页查询旅店以及城市的信息
*
* @param name 旅店名称
* @param pageable 分页信息
* @return Page<Object[]>
*/
@Query(value = "select t1.name as cityName,t2.name as hotelName\n" +
"from t_city t1\n" +
" left join t_hotel t2 on t2.city = t1.id\n" +
"where t2.name = :name",
countQuery = "select count(*)" +
"from t_city t1 \n" +
" left join t_hotel t2 on t2.city = t1.id\n" +
"where t2.name = :name"
, nativeQuery = true)
Page<Object[]> findCityAndHotel(@Param("name") String name, Pageable pageable);
为了节约时间 我只在select 与 from 之间 分别查询了城市的名称以及旅店的名称如果要查所有的信息,可以换成
t1.* ,
t2.*
单元测试
@Test
public void findCityAndHotel() throws Exception {
Page<Object[]> cityAndHotel = tCityRepository.findCityAndHotel("酒店", new PageRequest(0, 10));
Assert.assertTrue(cityAndHotel.getTotalElements() > 0);
}
3.HQL通过旅店名称查询旅店以及城市的所有信息
3和2其实是一样的,为了方便我就不作出分页查询了
HQL可以用map来接受返回的参数,具体的用法如下所示:
/**
* HQL通过旅店名称查询旅店以及城市的所有信息
*
* @return
*/
@Query(value = "select new map(t1,t2) from TCity t1 left join THotel t2 on t1.id=t2.city where t2.name =:name")
List<Map<String, Object>> findCityAndHotelByHQL(@Param("name") String name);
测试方法和2是差不多的 我就不粘贴了
Map
4.HQL通过旅店名称查询旅店以及城市的所有信息 直接返回实体类
/**
* 关联查询
*
* @return
*/
@Query(value = "select new pers.zpw.domain.CityHohel(t1.name AS cityName,t2.name AS hotelName) from TCity t1 left join THotel t2 on t1.id=t2.city where t2.name =:name")
List<CityHohel> findCityAndHotelByHQLResultObj(@Param("name") String name);
为了方便CityHohel我只封装了2个属性,这和HQL查询的字段是完全一致的,也必须要保持一致.
/**
* Created by ZhuPengWei on 2018/5/12.
*/
@Data
public class CityHohel { private String cityName;
private String hotelName; public CityHohel(String cityName, String hotelName) {
this.cityName = cityName;
this.hotelName = hotelName;
}
}
当然这个带参的构造方法是必须要写的,否则会抛出转换实体的异常
单元测试
@Test
public void findCityAndHotelByHQLResultObj() throws Exception { List<CityHohel> cityAndHotelByHQLResultObj = tCityRepository.findCityAndHotelByHQLResultObj("酒店");
Assert.assertTrue(cityAndHotelByHQLResultObj.size() > 0);
}
4.HQL通过旅店名称分页查询旅店以及城市的所有信息 直接返回实体类
/**
* 关联查询
*
* @return
*/
@Query(value = "select new pers.zpw.domain.CityHohel(t1.name AS cityName,t2.name AS hotelName) from TCity t1 left join THotel t2 on t1.id=t2.city where t2.name =:name",
countQuery = "select count(*) from TCity t1 left join THotel t2 on t1.id=t2.city where t2.name =:name")
Page<CityHohel> findCityAndHotelAllSelf(@Param("name") String name, Pageable pageable); @Test
public void findCityAndHotelAllSelf() throws Exception {
Page<CityHohel> cityAndHotelAllSelf = tCityRepository.findCityAndHotelAllSelf("酒店", new PageRequest(0, 10)); Assert.assertTrue(cityAndHotelAllSelf.getTotalElements() > 0);
}
5.动态查询旅店以及城市的所有信息 直接返回实体类
如果是动态查询的话当然首先得构造一条sql去查询了,当然如果不是自定义实体对象的话这样的网上一大堆我就不写了.
直接走测试
@Autowired
@PersistenceContext
private EntityManager entityManager; @Test
public void testDynamic() throws Exception {
String sql = "select new pers.zpw.domain.CityHohel(t1.name AS cityName,t2.name AS hotelName) from TCity t1 left join THotel t2 on t1.id=t2.city where t2.name ='酒店'";
Query query = entityManager.createQuery(sql);
List resultList = query.getResultList();
Assert.assertTrue(resultList.size() > 0);
}
这样测试是通过的,因此可以知道在业务层的方法中我们可以动态的构造SQL语句. 比如说可以在接口中这样子来定义一个方法
/**
* 自定义查询
* @param sql
* @param entityManager
* @return
*/
default List customQuery(String sql, EntityManager entityManager) {
return entityManager.createQuery(sql).getResultList();
}
然后在测试类中动态的根据条件去拼接SQL语句去调用
转载:https://blog.csdn.net/qq_36144258/article/details/80298354
SpringDataJPA - 复杂查询总结 (多表关联 以及 自定义分页 )的更多相关文章
- Django 07 Django模型基础2 (常用查询和多表关联)
Django 07 Django模型基础2 (常用查询和多表关联) 一.常用查询 #查找数据 def search_user(request): #获取 rs = User.objects.first ...
- Oracle - 查询语句 - 多表关联查询
/* SQL语句的历史版本 SQL89 比较多 SQL92 SQL99 多表关联查询 笛卡尔积 等值关联查询 非等值关联查询 左外连接 右外连接 全外连接 自连接 */ --------------- ...
- 完爆Facebook/GraphQL,APIJSON全方位对比解析(三)-表关联查询
相关阅读: 完爆Facebook/GraphQL,APIJSON全方位对比解析(一)-基础功能 完爆Facebook/GraphQL,APIJSON全方位对比解析(二)-权限控制 自APIJSON发布 ...
- oracle02--多表关联查询
1. 多表(关联)查询 多表查询也称之为关联查询.多表关联查询等,主要是指通过多个表的关联来获取数据的一种方式. 1.1. 多表映射关系 一对多:A表的一行数据,对应B表中的多条.如:一个部门可以对应 ...
- Mybatis-plus多表关联查询,多表分页查询
学习plus真的觉得写代码真的越来越舒服了.昨天开始接触吧,只要学会了多表关联查询.plus就能随意搭配使用了. 关于怎么搭建的就自行了去研究了哦.这里直接进入主题. 我用的是springboot+m ...
- Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)
Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...
- spring-data-jpa 介绍 复杂查询,包括多表关联,分页,排序等
本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求.这里不讲解JPA和Spring-data-jpa单独使用,所有的内容都是在和Spring ...
- Spring+MyBatis框架中sql语句的书写,数据集的传递以及多表关联查询
在很多Java EE项目中,Spring+MyBatis框架经常被用到,项目搭建在这里不再赘述,现在要将的是如何在项目中书写,增删改查的语句,如何操作数据库,以及后台如何获取数据,如何进行关联查询,以 ...
- Yii2中多表关联查询(join、joinwith)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name ...
随机推荐
- Java并发程序设计(十三)锁的性能优化
锁的性能优化 一.优化注意事件 一)减少锁的持有时间 只在必要时进行同步,能明显减少锁的持有时间. 二)锁的细化 缺陷:当系统需要全局锁时,其消耗的资源会比较多. 三)锁的分离 比如读写分离锁 四)锁 ...
- 使用TVTK库创建一个矩形视图
from tvtk.api import tvtk # s=tvtk.ConeSource(height=,radius=) # print(s.center) #创建一个长方体数据源,并同时设置长宽 ...
- 搞IT,算法编程不错的学习网址 & 一些专栏博客大神的地址(汇总)
博客专栏大神 王晓华(算法的乐趣) 算法系列:http://blog.csdn.net/orbit/article/category/830251 PostgreSQL深入理解内核系列:http:// ...
- BZOJ3682 Phorni 后缀平衡树
后缀平衡树的裸题 后缀平衡树简单的思想如下 具体的可以去看$clj$的论文 假设我们已经有了串$S$的后缀平衡树 插入一个字母$c$ 我们用$Si$代表原串$S$从第$i$个字符开始的后缀 则后缀$c ...
- 利用dockerfile定制镜像
利用dockerfile定制镜像 镜像的定制就是定制每一层所添加的配置.文件.如果可以吧每一层修改.安装.构建.操作的命令都写入到一个脚本,用脚本来构建.定制镜像,这个脚本就是dockerfile. ...
- Java API概述
collection of APIs(Application Programming Interface) java.lang — automatically imported into Java p ...
- android stuido 的几个点
- .net core 3.0视图动态编译
之前在使用Visual Studio 2019的时候,就发现asp.net 3.0中没有cshtml动态编译的功能了:也就是说,如果改了cshtml,刷新页面不会立即生效,而是要重新编译一次才行. 这 ...
- java 线程池 使用实例
在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...
- Java 对字符串数据进行MD5/SHA1哈希散列运算
Java对字符串数据进行MD5/SHA1哈希散列运算 [java] view plain copy package cn.aibo.test; import java.security.Message ...