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查询方法

相关推荐
你才是臭弟弟4 小时前
时序数据库(TDengine TSDB)基本SQL使用
sql·时序数据库·tdengine
Gauss松鼠会5 小时前
【openGauss】学习 gsql 命令行的使用
数据库·sql·database·opengauss
Gauss松鼠会7 小时前
【openGauss】openGauss 如何进行数据库例行维护
数据库·sql·database·opengauss
l1t8 小时前
利用DeepSeek辅助翻译clickhouse SQL为DuckDB 格式求解Advent of Code 2025第10题 电子工厂 第二部分
数据库·人工智能·sql·clickhouse·duckdb
DarkAthena8 小时前
【GaussDB】分析函数性能优化案例-row_number改写
数据库·sql·oracle·性能优化·gaussdb
踢足球09298 小时前
寒假打卡:2026-01-21
数据库·sql
麦聪聊数据8 小时前
基于SQL+CDC构建MySQL到ClickHouse的实时链路
sql·mysql·clickhouse
IT大白8 小时前
6、数据库优化
数据库·sql
sg_knight9 小时前
SQL 中的 IFNULL 函数是什么?
数据库·sql·mysql·oracle·database·关系型数据库·db
菩提小狗10 小时前
Sqli-Labs Less4:双引号字符型 SQL 注入详解|靶场|网络安全
数据库·sql·web安全