69、Spring Data JPA 的 @Query查询 和 命名查询

@Query查询 和 命名查询的区别:

命名查询与直接用@Query来定义查询的本质是一样,只不过它们定义SQL或JPQL语句的位置不同。

直接用 @Query来定义查询 ,写SQL或JPQL语句的位置在 DAO 组件
命名查询 ,写SQL或JPQL语句的位置在 实体类 上面

★ @Query查询(半自动:提供SQL或JPQL)

让开发者指定JPQL或SQL查询,剩下的事情由Spring Data来负责完成:帮你生成查询方法、实现查询功能。

▲ @Query注解

复制代码
通过使用@Query注解修饰查询方法,可以让查询方法使用自定义的JPQL或SQL执行查询,
该注解可以指定如下常用属性:

- name:指定使用哪个命名查询。
        命名查询的本质就是为JPQL或SQL语句起个名字,
        因此指定使用哪个命名查询也就是指定了JPQL或SQL语句。

- nativeQuery:指定是否为SQL查询,如果该属性为true,表明是原生SQL查询,否则就是JPQL查询。

- value:指定自定义的JPQL或SQL语句。

@Query(nativeQuery = true , value=" ") 这个指定为 SQL 语句查询,也叫命名查询,也就是指定使用 SQL 命名查询

代码演示:

复制代码
jpa 的 @Query 的 JPQL 不能用 select * from  ,就是不能用 * ,但可以用表的别名代替:
比如:select * from table  ------->  select t from Table t

需求:根据学生的姓名和教室的名字查询学生,使用 @Query 指定 JPQL 语句查询

( JPQL 是 @Query 默认原生方法)

测试结果:

需求:根据班级名称name模糊查询Clazz对象

使用 @Query 指定 SQL 语句,nativeQuery = true 说明是使用 SQL 查询

测试结果:

▲ Modifying注解

复制代码
如果@Query注解指定的查询语句要对底层数据进行修改,还需要使用@Modifying注解修饰该方法,

该注解修饰的方法可以修改底层的数据。


【提示:】 Spring Boot有一个很优秀的设计,当你在测试DAO组件的方法时,
          测试完成后方法的测试结果会自动回滚。

如果你确实想在测试DAO组件时,测试结束后提交事务,而不是回滚事务(默认设置)。
------ 只要将测试方法添加@Rollback(false)

代码演示

需求:修改指定年龄的指定name值,把年龄大于500的学生的name改成"张三"

如果使用 JPQL语句 或 SQL语句 要修改数据库数据,该方法需要添加 @Modifying 注解

测试结果:

如果想在测试DAO组件时,测试结束后提交事务,而不是回滚事务(默认设置)。

------ 只要在测试方法上添加@Rollback(false)

★ 命名查询

@Query(nativeQuery = true , value=" ") 这个指定为 SQL 语句查询,也叫命名查询,也就是指定使用 SQL 命名查询

复制代码
甚至不再需要使用@Query注解
------只要让@NamedQuery或@NamedNativeQuery所定义的命名查询的查询名等于实体类的类名+DAO组件的查询方法的方法名
    中间以点号(.)隔开。
    
@NamedQuery或@NamedNativeQuery一般用在实体类上定义查询语句。

不难发现,命名查询与直接用@Query来定义查询的本质是一样,
只不过它们定义SQL或JPQL语句的位置不同。

直接用 @Query来定义查询 ,写SQL或JPQL语句的位置在 DAO 组件
命名查询 ,写SQL或JPQL语句的位置在 实体类 上面

代码演示

演示不用 @Query 的命名查询

在DAO组件写上查询方法,然后再实体类上通过注解,再写对应的sql语句

@NamedQuery或@NamedNativeQuery一般用在 实体类 上定义查询语句。

@NamedQuery 或 @NamedNativeQuery 所定义的 命名查询 的 查询名 等于

实体类的类名+DAO组件的查询方法的方法名,中间以点号(.)隔开

测试结果:

结果一致,没啥问题,都是查相同的数据,只是一个用 JPQL 原生的查询方法,一个是SQL查询方法

相关推荐
我的golang之路果然有问题3 小时前
速成GO访问sql,个人笔记
经验分享·笔记·后端·sql·golang·go·database
秃头佛爷4 小时前
常用SQL整理
数据库·sql
浩浩测试一下6 小时前
SQL注入高级绕过手法汇总 重点
数据库·sql·安全·web安全·网络安全·oracle·安全架构
獨枭7 小时前
SQL Server 2019 安装与配置详细教程
sql·sqlserver
bing_1588 小时前
在 Spring Boot 项目中如何使用索引来优化 SQL 查询?
spring boot·sql·索引优化
husterlichf9 小时前
MYSQL 常用字符串函数 和 时间函数详解
数据库·sql·mysql
什么芮.9 小时前
spark-streaming
pytorch·sql·spark·kafka·scala
husterlichf13 小时前
MYSQL 常用数值函数 和 条件函数 详解
数据库·sql·mysql
农民也会写代码13 小时前
dedecms织梦arclist标签noflag属性过滤多个参数
开发语言·数据库·sql·php·dedecms
m0_7482329213 小时前
你还在手动画ER图吗?让SQL自动生成ER图,轻松解决作业难题!
数据库·sql·oracle