iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Spring Data Jpa复杂查询的示例分析
  • 344
分享到

Spring Data Jpa复杂查询的示例分析

2023-06-29 07:06:44 344人浏览 泡泡鱼
摘要

小编给大家分享一下spring Data Jpa复杂查询的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring Data Jpa

小编给大家分享一下spring Data Jpa复杂查询的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Spring Data Jpa复杂查询总结

只是做一个总结所以就不多说废话了

实体类

@Entity@Table(name = "t_hotel")@Datapublic class THotel {    @Id    private int id;    private String name;    private String address;        private String city;}
@Entity@Table(name = "t_city")@Datapublic class TCity {    @Id    private int id;    private String name;    private String state;    private String country;    private String map;}

在启动SpringBoot的时候 SpringDataJpa会自动的在数据库中生成表结构.

为了查询要求,我随便的增加了一些数据,如下图所示

Spring Data Jpa复杂查询的示例分析

Spring Data Jpa复杂查询的示例分析

新建接口

public interface TCityRepository extends JpaRepository<TCity, Integer>, JpaSpecificationExecutor<TCity> {  }

单元测试

@RunWith(SpringRunner.class)@SpringBootTestpublic class TCityRepositoryTest{     @Autowired    private TCityRepository tCityRepository;}

1.查找出Id小于3,并且名称带有shanghai的记录

List<TCity> findByIdLessThanAndNameLike(int id, String name);

单元测试

@Testpublic void findByIdLessThanAndNameLike() throws Exception {    List<TCity> shanghai = tCityRepository.findByIdLessThanAndNameLike(3, "%shanghai%");    Assert.assertTrue(shanghai.size() > 0);}

2.通过旅店名称分页查询旅店以及城市的所有信息

@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.*

单元测试

 @Testpublic void findCityAndHotel() throws Exception {    Page<Object[]> cityAndHotel = tCityRepository.findCityAndHotel("酒店", new PageRequest(0, 10));    Assert.assertTrue(cityAndHotel.getTotalElements() > 0);}

关于把List<Object[]> 转换成List<对象> 的方法 我已经在上一篇JPA的文章中比较清楚的说了,因此我就不再重复的叙述一遍了

3.HQL通过旅店名称查询旅店以及城市的所有信息

3和2其实是一样的,为了方便我就不作出分页查询了

HQL可以用map来接受返回的参数,具体的用法如下所示:

@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<String.Object> 转换实体类的方法也挺多的我就不多说了,如果是直接返回给前台的话,也没有必要转换成对象.

4.HQL通过旅店名称查询旅店以及城市的所有信息 直接返回实体类

@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查询的字段是完全一致的,也必须要保持一致.

@Datapublic class CityHohel {        private String cityName;        private String hotelName;                public CityHohel(String cityName, String hotelName) {            this.cityName = cityName;            this.hotelName = hotelName;        }}

当然这个带参的构造方法是必须要写的,否则会抛出转换实体的异常

单元测试

@Testpublic void findCityAndHotelByHQLResultObj() throws Exception {    List<CityHohel> cityAndHotelByHQLResultObj = tCityRepository.findCityAndHotelByHQLResultObj("酒店");    Assert.assertTrue(cityAndHotelByHQLResultObj.size() > 0);}

HQL通过旅店名称分页查询旅店以及城市的所有信息 直接返回实体类

@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);
@Testpublic void findCityAndHotelAllSelf() throws Exception {    Page<CityHohel> cityAndHotelAllSelf = tCityRepository.findCityAndHotelAllSelf("酒店", new PageRequest(0, 10));    Assert.assertTrue(cityAndHotelAllSelf.getTotalElements() > 0);}

5.动态查询旅店以及城市的所有信息 直接返回实体类

如果是动态查询的话当然首先得构造一条sql去查询了,当然如果不是自定义实体对象的话这样的网上一大堆我就不写了.

直接走测试

@Autowired@PersistenceContextprivate EntityManager entityManager;@Testpublic 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语句. 比如说可以在接口中这样子来定义一个方法

  default List custoMQuery(String sql, EntityManager entityManager) {    return entityManager.createQuery(sql).getResultList();}

然后在测试类中动态的根据条件去拼接SQL语句去调用 

JPA#复杂查询#自定义查询

编写自定义SQL基于下面信息

SpringData JPA 在为Repository接口生成实现的时候,会查找是否有 "接口名称"+"Impl"的类,如果有的话,就把这个类的方法合并到要生成的实现当中。

假设:要为接口StudentRepository编写自定义sql查询。

基于最前面的信息,要编写自定义SQL

需要下面三步:

自定义一个接口,在在接口中声明方法StudentCoustomRepository,这个自定义接口名称不重要;

让目标接口继承自定义接口,这样目标接口就有了相应的方法;

编写自定义方法的实现类,这个类需要使用"目标接口名称"+"Impl"为类名,

即StudentRepositoryImpl,这样SpringDataJpa 为StudentRepository生成实现的时候就会包含这里面的方法了。

public class StudentRepositoryImpl implements StudentCoustomRepository {         // 这里可以写很复杂的SQL,作为演示之用,就不弄那么复杂    private static final String SQL = "select * from t_student where name like :name ";         @PersistenceContext    private EntityManager em;     @SuppressWarnings({ "rawtypes", "unchecked" })    @Override    public List<StudentVO> findByName(String name) {        Query query = em.createNativeQuery(SQL).setParameter("name", "%"+name+"%");        query.unwrap(SQLQuery.class).setResultTransfORMer(Transformers.ALIAS_TO_ENTITY_MAP);        List queryList = query.getResultList();                 if (queryList.size() == 0) {            System.out.println("找不到Student name为" + name + "的记录");            return null;        }                 List<StudentVO> retVal = new ArrayList<>();        for(Object o : queryList) {            Map student = (Map)o;            StudentVO vo = new StudentVO();            try {                // org.apache.commons.beanutils.BeanUtils;                // 使用apaches的beanutil,直接吧map转为实例                BeanUtils.populate(vo, student);                retVal.add(vo);            } catch (IllegalAccessException | InvocationTargetException e) {                System.out.println("解析StudentVO bean时发生异常:" + e.getMessage());            }        }        return retVal;    }}

以上是“Spring Data Jpa复杂查询的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Spring Data Jpa复杂查询的示例分析

本文链接: https://www.lsjlt.com/news/323224.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring Data Jpa复杂查询的示例分析
    小编给大家分享一下Spring Data Jpa复杂查询的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring Data Jpa...
    99+
    2023-06-29
  • Spring Data JPA中的动态查询实例
    spring Data JPA大大的简化了我们持久层的开发,但是实际应用中,我们还是需要动态查询的。比如,前端有多个条件,这些条件很多都是可选的,那么后端的SQL,就应该是可以定制的,在使用hibernate的时候,可以通过判断条件来拼接S...
    99+
    2023-05-31
    spring data jpa
  • MySQL查询语句之复杂查询的示例分析
    这篇文章主要介绍MySQL查询语句之复杂查询的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有...
    99+
    2022-10-18
  • Nest复杂查询示例解析
    目录Nest 复杂查询QueryUserDto是查询参数类型UserService如何实现Nest 复杂查询 复杂查询包括分页、模糊查询、多条件筛选、排序等,满足前端对查询的所有诉求...
    99+
    2022-12-08
    Nest 复杂查询 Nest 查询
  • Spring Data Jpa 复杂查询方式总结(多表关联及自定义分页)
    目录Spring Data Jpa复杂查询总结1.查找出Id小于3,并且名称带有shanghai的记录2.通过旅店名称分页查询旅店以及城市的所有信息3.HQL通过旅店名称查询旅店以及...
    99+
    2022-11-13
  • JPA原生SQL分页查询逻辑的示例分析
    这篇文章将为大家详细讲解有关JPA原生SQL分页查询逻辑的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JPA原生SQL(自定义SQL)分页查询JPA自己写SQL查询的话,分页还稍微麻烦经过测试下...
    99+
    2023-06-21
  • spring data jpa开启批量插入、批量更新的示例分析
    这篇文章给大家分享的是有关spring data jpa开启批量插入、批量更新的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。ORM框架,最早我用的是jdbcTemplate,后来用了Mybatis,唯独...
    99+
    2023-06-20
  • spring data jpa查询一个实体类的部分属性方式
    目录springdatajpa查询一个实体类的部分属性首先我们定义两个实体类然后创建person实体类的repository返回结果只包含firstName和lastName两个属性...
    99+
    2022-11-13
  • 使用Spring Data JPA如何实现多条件的分页查询
    使用Spring Data JPA如何实现多条件的分页查询?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。话不多说,请看代码:public Map<String, Obje...
    99+
    2023-05-31
    spring 分页查询 dat
  • LINQ查询的示例分析
    这篇文章主要介绍LINQ查询的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在之前的C#版中,开发者应用许多不同的查询语言来访问不同的数据源。例如,要查询一个XML文件,开发者会使用XPath,要查询一个SQ...
    99+
    2023-06-17
  • OJB查询的示例分析
    这篇文章主要为大家展示了“OJB查询的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“OJB查询的示例分析”这篇文章吧。OJB查询该文档介绍了不同查询机制的使用。文档中的代码都通过Juni...
    99+
    2023-06-03
  • spring中mybatis多表查询处理的示例分析
    这篇文章将为大家详细讲解有关spring中mybatis多表查询处理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。package com.swhy.bw.advisor.center....
    99+
    2023-06-02
  • JS复杂判断的示例分析
    这篇文章给大家分享的是有关JS复杂判断的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。先看一段代码 const onButtonClick1 =&nb...
    99+
    2022-10-19
  • Java复杂链表的示例分析
    这篇文章将为大家详细讲解有关Java复杂链表的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.题目请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 ...
    99+
    2023-06-28
  • Oracle分页查询的示例分析
    这篇文章主要介绍Oracle分页查询的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Oracle分页查询的实例详解1.Oracle分页查询:SELECT *...
    99+
    2022-10-18
  • ajax分页查询的示例分析
    这篇文章主要为大家展示了“ajax分页查询的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ajax分页查询的示例分析”这篇文章吧。(1)先写个显示数据的...
    99+
    2022-10-19
  • innodb查询锁的示例分析
    这篇文章主要为大家展示了“innodb查询锁的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“innodb查询锁的示例分析”这篇文章吧。 ...
    99+
    2022-10-18
  • Angular1.x复杂指令的示例分析
    这篇文章主要介绍了Angular1.x复杂指令的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:名称描述compile指定一...
    99+
    2022-10-19
  • MySQL数据查询之子查询的示例分析
    这篇文章主要介绍了MySQL数据查询之子查询的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。子查询是指一个查询语句嵌套在另一个查询语...
    99+
    2022-10-18
  • MySQL中子查询的示例分析
    这篇文章主要介绍了MySQL中子查询的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、子查询定义   定义:  子查询允许把一个查询嵌套在另一个查询当中。...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作