SpringBoot从入门到精通(二十七)JPA实现自定义查询,完全不需要写SQL! 您所在的位置:网站首页 jparepository查询 SpringBoot从入门到精通(二十七)JPA实现自定义查询,完全不需要写SQL!

SpringBoot从入门到精通(二十七)JPA实现自定义查询,完全不需要写SQL!

#SpringBoot从入门到精通(二十七)JPA实现自定义查询,完全不需要写SQL!| 来源: 网络整理| 查看: 265

前面讲了Spring Boot 整合Spring Boot JPA,实现JPA 的增、删、改、查的功能。JPA使用非常简单,只需继承JpaRepository ,无需任何数据访问层和sql语句即可实现完整的数据操作方法。

JPA除了这些功能和优势之外,还有非常强大的查询的功能。以前复查的查询都需要拼接很多查询条件,JPA 有非常方便和优雅的方式来解决。Spring Data JPA 查询分为三种:

1、Spring Data JPA 默认实现的预定义的方法

2、需要根据查询的情况定义查询条件

3、通过@Query 注解,自定义hql 查询语句

接下来就聊一聊JPA 自定义查询,体验Spring Data JPA 的强大。

一、预定义查询

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

image.png

我们看到,JpaRepository类默认自带了很多数据操作方法,包括save、delete、findAll、fidById、等方法。调用这些预定义的预定义方法也非常简单,具体如下所示:

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

二、自定义查询

Spring Data JPA 支持根据实体的某个属性实现数据库操作,主要的语法是 findByXX、 readAByXX、queryByXX、 countByXX、 getByXX 后跟属性名称。

利用这个功能仅需要在定义的 Repository 中添加对应的方法名即可,无需具体实现完整的方法,使用时 Spring Boot 会自动动帮我们实现对应的sql语句。

1、属性查询

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

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

2、组合条件查询

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

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

3、JPA关键字

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

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

三、自定义SQL语句

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

说明:

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

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

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

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

四、已命名查询

除了使用 @Query注解外,还可以使用@NamedQuery与@NameQueries等注解定义命名查询。JPA的命名查询实际上就是给SQL查询语句起一个名字,执行查询时就是直接使用起的名字,避免重复写JPQL语句,使得查询方法能够复用。下面通过示例程序演示JPA已命名查询。

1. 定义命名查询

在实体类中,@NamedQuery注解定义一个命名查询语句,示例代码如下:

在上面的示例中,@NamedQuery中的name属性指定命名查询的名称,query属性指定命名查询的语句。如果要定义多个命名查询方法,则需要使用@NamedQueries注解:

在上面的示例中,在User实体类中定义了findAllUser()、findUserWithId()、findUserWithName()三种方法。

2. 调用命名查询

定义命名查询后,可以使用EntityManager类中的createNamedQuery()方法传入命名查询的名称来创建查询:

在上面的示例中,使用createNamedQuery创建对应的查询,JPA会先根据传入的查询名查找对应的NamedQuery,然后通过调用getResultList()方法执行查询并返回结果。

3. 运行验证

单击Run Test或在方法上右击,选择Run 'testNamedQuery',运行全部测试方法,结果如图9-7所示。定义的已命名查询findUserWithName的单元测试运行成功,并输出了相应的查询结果,说明使用JPA实现了自定义的已命名查询的功能。

image.png

最后

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有