前面讲了Spring Boot 整合Spring Boot JPA,实现JPA 的增、删、改、查的功能。JPA使用非常简单,只需继承JpaRepository ,无需任何数据访问层和sql语句即可实现完整的数据操作方法。JPA除了这些功能和优势之外,还有非常强大的查询的功能。以前复查的查询都需要拼接很多查询条件,JPA 有非常方便和优雅的方式来解决。接下来就聊一聊JPA 自定义查询,体验Spring Data JPA 的强大。

Spring Data JPA 查询分为两种,一种是 Spring Data JPA 默认实现的预定义的方法,另一种是需要根据查询的情况定义查询条件。

一、预定义查询

预定义方法就是我们上面看到的那些自带的方法,因为UserRepository继承了 JpaRepository 拥有了父类的这些JPA自带的方法。如下图所示:

调用预定义方法:

@RequestMapping("/test")
public void test() {
Users user = new Users();
user.setId((long) 1); userRespository.findById((long) 1);
userRespository.findAll();
userRespository.delete(user);
userRespository.deleteById((long) 1);
userRespository.existsById((long) 1);
}

上面所有JpaRepository父类拥有的方法都可以直接调用 。

二、自定义查询

Spring Data JPA 支持根据实体的某个属性实现数据库操作,主要的语法是 findByXX、 readAByXX、queryByXX、 countByXX、 getByXX 后跟属性名称,利用这个功能仅需要在定义的 Repository 中添加对应的方法名即可,无需具体实现完整的方法,使用时 Spring Boot 会自动动帮我们实现对应的sql语句。

1、属性查询

根据姓名查询,示例如下:

@Repository
public interface UserRespository extends JpaRepository<Users, Long> {
Users findByName(String name,String account);
}

上面的实例可以看到,我们可以在UserRepository 接口中进行接口声明。例如,如果想根据实体的 name和account 这两个属性来进行查询User的信息。那么直接在 UserRepository 中增加一个接口声明即可。

2、组合条件查询

JPA不仅支持单个属性查询,还能支持多个属性,根据And、or 等关键字组合查询:

  Users findByNameAndAccount(String name,String account);

上面的例子,就是根据姓名和账号两个条件组合查询。这个是组合查询的例子,删除和统计也是类似的:deleteByXXXAndXXX、countByXXXAndXXX。可以根据查询的条件不断地添加和拼接, Spring Boot 都可以正确解析和执行。

3、JPA关键字

JPA的自定义查询除了And、or 关键字外,基本上SQL语法中的关键字,JPA都支持,比如:like,between 等。

这个语句结构可以用下面的表来说明:

三、自定义SQL语句

上面介绍了JPA的很多条件查询的方法。但是,实际项目中,还是有些场景上面的查询条件无法满足。那么我们就可以通过 @Query 注解写hql 来实现。

@Query("select u from Users u where u.name = :name1")
List<UserDO> findByHql(@Param("name1") String name1);

说明:

  1、@Query 注解,表示用执行hql语句。

  2、name1等参数对应定义的参数。

上面是通过hql,如果hql 写着不习惯,也可以用本地 SQL 语句来完成查询:

@Query(value = "select * from users where name = ?1",nativeQuery = true)
List<User> findUserBySql(String name);

上面示例中的 ?1 表示方法参数中的顺序,nativeQuery = true 表示执行原生sql语句。

最后

以上就把Spring Data JPA的查询功能介绍完了, JPA 简化了我们对数据库的操作,预定义很多常用的数据库方法,直接使用即可。另外 JPA 还有一个特点,就是不用关心数据库的表结构,需要更改的时候只需要修改对应 Model 的属性即可。

Spring Boot 入门系列(二十七)使用Spring Data JPA 自定义查询如此简单,完全不需要写SQL!的更多相关文章

  1. Spring Boot入门系列(十七)整合Mybatis,创建自定义mapper 实现多表关联查询!

    之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.mybatis 插件自动生成的mappe ...

  2. Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件

    上一篇文章,写了如何搭建一个简单的Spring boot项目,本篇是接着上一篇文章写得:Spring boot入门:快速搭建Spring boot项目(一),主要是spring boot集成mybat ...

  3. 学习Spring Boot:(二十七)Spring Boot 2.0 中使用 Actuator

    前言 主要是完成微服务的监控,完成监控治理.可以查看微服务间的数据处理和调用,当它们之间出现了异常,就可以快速定位到出现问题的地方. springboot - version: 2.0 正文 依赖 m ...

  4. Spring Boot入门系列(十六)使用pagehelper实现分页功能

    之前讲了Springboot整合Mybatis,然后介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.接下来要说一说Mybatis 的分页 ...

  5. Spring Boot入门系列(十三)如何实现事务

    前面介绍了Spring Boot 中的整合Mybatis并实现增删改查.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1 ...

  6. Spring Boot入门系列(二十)快速打造Restful API 接口

    spring boot入门系列文章已经写到第二十篇,前面我们讲了spring boot的基础入门的内容,也介绍了spring boot 整合mybatis,整合redis.整合Thymeleaf 模板 ...

  7. Spring Boot入门教程2-1、使用Spring Boot+MyBatis访问数据库(CURD)注解版

    一.前言 什么是MyBatis?MyBatis是目前Java平台最为流行的ORM框架https://baike.baidu.com/item/MyBatis/2824918 本篇开发环境1.操作系统: ...

  8. Spring Boot入门教程1、使用Spring Boot构建第一个Web应用程序

    一.前言 什么是Spring Boot?Spring Boot就是一个让你使用Spring构建应用时减少配置的一个框架.约定优于配置,一定程度上提高了开发效率.https://zhuanlan.zhi ...

  9. spring boot 入门操作(二)

    spring boot入门操作 使用FastJson解析json数据 pom dependencies里添加fastjson依赖 <dependency> <groupId>c ...

随机推荐

  1. RSA加密算法学习

    一.公钥加密算法 对称加密 非对称加密 二.RSA加密算法

  2. 3、基于Python建立任意层数的深度神经网络

    一.神经网络介绍: 神经网络算法参考人的神经元原理(轴突.树突.神经核),在很多神经元基础上构建神经网络模型,每个神经元可看作一个个学习单元.这些神经元采纳一定的特征作为输入,根据自身的模型得到输出. ...

  3. Package Repository for Ubuntu Offline Installation

    For example, we need install "unzip" command on a Ubuntu machine without Internet. On a on ...

  4. 修改Linux系统的默认语言编码集

    RedHat 今天晚上发现服务器上vi的界面提示变成了乱码,只能将XShell的编码改为GBK才能正常显示,导致consolas字体无法使用,GBK编码下的字体丑陋无比,无法忍受,一轮google之后 ...

  5. PXE高效批量装机

    目录 一.PXE概述 二.PXE的优点 三.搭建PXE的前提 四.搭建PXE远程安装服务器 4.1.安装并启用TFTP服务 4.2.安装dhcp服务 4.3.准备linux内核.初始化镜像文件 4.3 ...

  6. iOS开发之HTTP断点续传

    前言 在APP中经常会遇到文件下载,鉴于用户体验和流量控制,就需要用到断点续传.本文主要对断点续传进行了多线程封装. 效果图 原理 HTTP实现断点续传是通过HTTP报文头部header里面设置的两个 ...

  7. GraphQL API vs REST API

    REST是构建API的一种流行方法,而且比GraphQL应用更广泛,让我们看看GraphQL和REST的区别. Rest是一个概念 REST是一个事实上的架构标准,但它实际上没有规范,有大量的非官方定 ...

  8. 联合迭代器与生成器,enumerate() 内置函数真香!

    花下猫语:Python 中很多内置函数的作用都非常大,比如说 enumerate() 和 zip(),它们使得我们在作迭代操作时极为顺手.这是一篇很多年前的 PEP,提议在 Python 2.3 版本 ...

  9. iNeuOS工业互联平台,聚合和变化率计算、设备IO和通讯状态、组态快捷键、创建文件夹、选择应用图标等,发布:v3.6版本

    目       录 1.      概述... 2 2.      平台演示... 2 3.      聚合和变化率计算... 2 4.      设备IO和通讯状态监测... 3 5.      组 ...

  10. Intellj IDEA 光标显示insert状态解决办法

    使用idea过程中,不知道怎么回事,鼠标的光标老是insert状态,体验效果极其差劲,于是去百度,扒拉了好一阵,过滤了垃圾博客,发现了有两种方法可以解决此问题: 第一种方法: 在File------& ...