实体类

@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 - 复杂查询总结 (多表关联 以及 自定义分页 )的更多相关文章

  1. Django 07 Django模型基础2 (常用查询和多表关联)

    Django 07 Django模型基础2 (常用查询和多表关联) 一.常用查询 #查找数据 def search_user(request): #获取 rs = User.objects.first ...

  2. Oracle - 查询语句 - 多表关联查询

    /* SQL语句的历史版本 SQL89 比较多 SQL92 SQL99 多表关联查询 笛卡尔积 等值关联查询 非等值关联查询 左外连接 右外连接 全外连接 自连接 */ --------------- ...

  3. 完爆Facebook/GraphQL,APIJSON全方位对比解析(三)-表关联查询

    相关阅读: 完爆Facebook/GraphQL,APIJSON全方位对比解析(一)-基础功能 完爆Facebook/GraphQL,APIJSON全方位对比解析(二)-权限控制 自APIJSON发布 ...

  4. oracle02--多表关联查询

    1. 多表(关联)查询 多表查询也称之为关联查询.多表关联查询等,主要是指通过多个表的关联来获取数据的一种方式. 1.1. 多表映射关系 一对多:A表的一行数据,对应B表中的多条.如:一个部门可以对应 ...

  5. Mybatis-plus多表关联查询,多表分页查询

    学习plus真的觉得写代码真的越来越舒服了.昨天开始接触吧,只要学会了多表关联查询.plus就能随意搭配使用了. 关于怎么搭建的就自行了去研究了哦.这里直接进入主题. 我用的是springboot+m ...

  6. Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)

    Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...

  7. spring-data-jpa 介绍 复杂查询,包括多表关联,分页,排序等

    本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求.这里不讲解JPA和Spring-data-jpa单独使用,所有的内容都是在和Spring ...

  8. Spring+MyBatis框架中sql语句的书写,数据集的传递以及多表关联查询

    在很多Java EE项目中,Spring+MyBatis框架经常被用到,项目搭建在这里不再赘述,现在要将的是如何在项目中书写,增删改查的语句,如何操作数据库,以及后台如何获取数据,如何进行关联查询,以 ...

  9. Yii2中多表关联查询(join、joinwith)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order      (id  order_name ...

随机推荐

  1. bzoj3693: 圆桌会议 二分图 hall定理

    目录 题目链接 题解 代码 题目链接 bzoj3693: 圆桌会议 题解 对与每个人构建二分,问题化为时候有一个匹配取了所有的人 Hall定理--对于任意的二分图G,G的两个部分为X={x1,x2,- ...

  2. LOJ.6284.数列分块入门8(分块)

    题目链接 \(Description\) 给出一个长为n的数列,以及n个操作,操作涉及区间询问等于一个数c的元素,并将这个区间的所有元素改为c. \(Solution\) 模拟一些数据可以发现,询问后 ...

  3. Python中的正则表达式探秘1

    正则表达式中的特殊字符: $ 匹配输入字符串的结尾位置.如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'.要匹配 $ 字符本身,请使用 \$. ( ) ...

  4. php 使用curl获取Location:重定向后url

    在php获取http头部信息上,php有个自带的函数get_headers(),我以前也是用这个的,听说效率在win上不咋地,再加上最近研究百度url无果,写了cURL获取重定向url的php代码来折 ...

  5. 95. 不同的二叉搜索树 II

    95. 不同的二叉搜索树 II 题意 给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树. 解题思路 这道题目是基于不同的二叉搜索树进行改进的: 对于连续整数序列[left, ri ...

  6. failed to load class "org.sl4j.impl.StaticLoggerBinder"

    (1)要确保有properties文件在你的主项目的src下面 (2)https://www.slf4j.org/codes.html(这个是配置相关文件) (3)如果经过1.2步后问题依然存在,那么 ...

  7. db2配置、db和dbm

    ----start DB2 可以在四个不同层面配置: 一:系统环境变量(System Environment Variable) 系统环境变量用来配置DB2 的使用环境: 查看:set | grep  ...

  8. 解决 Mac 的 Terminal 中,Java 乱码的问题

    在 .bash_profile 文件中,增加如下行: export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 然后,重新加载该配置 source .bash_pr ...

  9. windows Server 2008 R2 IE增强安全配置正在阻止来自下列网站的内容

    1.在windows Server 2008 R2上访问百度,会出现以下界面 当在Windows Sever 2008 R2中运动IE8的时候会发现默认情况下IE启用了增强的安全配置,为了方便而且是在 ...

  10. 访问win10的远程桌面(Remote Desktop)总是凭据或者用户密码错误

    家里电脑是Win10的,原来可以在公司通过远程桌面访问,最近自动升级了一次补丁后,远程可以连接,但是输入正确的用户密码后总提示凭据错误 (Win10是被访问的一方,修改的也是被访问的机器) 修复方式为 ...