Spring Data Jpa 使用@Query标注自定义查询语句

Spring Data JPA 核心原理与工程实践指南 Spring Data JPA 是 Java 生态中基于 JPA 规范实现的标准化数据访问抽象,其本质是将 ORM(对象关系映射)能力通过 Spring 的 IoC 容器、AOP 事务和约定优于配置思想进行深度封装。它不替代 JDBC,而是在 JPA 实现(如 Hibernate)之上提供面向接口的声明式开发体验,显著降低数据层代码复杂度。技术价值体现在快速迭代支持(如方法名自动解析查询)、事务声明式管理(@Transactional)、以及与 Spring Boot 的无缝集成。典型应用场景包括业务系统 阅读详情

在使用JPA访问关系型数据库和Spring Data Jpa: 分页和排序两篇文章中我们学会了如何使用Spring Data Jpa 进行简单的查询以及分页等功能,Spring Data Jpa本身所支持的功能已经非常强大了,也能够支持大部分的场景。但是,现实场景永远比想象的要复杂,有时候我们确实需要像Sql语句这样更加强大以及灵活的方式来进行查询。Spring Data Jpa 当然给我们提供了这样的方式,我们可以使用@Query标注轻松的使用类似sql查询的功能。今天我们来尝试一下如何使用@Query标注来自定义查询吧。

基础对象

Spring Data Jpa所提供的通过方法名进行查询的功能已经能够覆盖绝大多数单表查询了。但是,我们的查询绝不仅限于单表查询,很多时候我们还是需要进行多表查询的,因此我们今天设计两个表,blog以及user,通过这两个表的联合查询来试验@Query标注。

@Entity
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    
    private String username;
    private String role;
    ......
}
@Entity
public class Blog {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    
    private String title;
    private String content;
    
    @ManyToOne
    private User creator;
    ......
}

关联查询

blog表和user表通过creator相关联。在user表中,我们设计了一个属性角色--role。如果我们想找到某种角色的用户所创建的blog列表应该怎么办?让我们通过@Query标注去实现它吧:

public interface BlogRepository extends PagingAndSortingRepository<Blog, Integer> {
    
    @Query("select blog from Blog blog join blog.creator creator where creator.role = ?1")
    Page<Blog> findByRole(String role, Pageable pageable);
    
}

在BlogRepository中,我们通过@Query标注使用了HQL进行查询,通过它,我们可以更加灵活的进行各种查询(当然,Spring Data JPA同样支持多表联查),如果不喜欢使用方法名来定义查询条件或者查询过于复杂的话,@Query标注是一个很不错的选择。

查询结果

我们来写一个Controller展示我们的查询结果:

@RestController
public class TestController {
    
    @Autowired BlogRepository blogRepository;
    
    @RequestMapping(value = "", method=RequestMethod.GET)
    public Page<Blog> getEntryByPageable(@PageableDefault(value = 15, sort = { "id" }, direction = Sort.Direction.DESC) 
        Pageable pageable, @RequestParam(value = "role", defaultValue = "") String role) {
        if("".equals(role)){
            return blogRepository.findAll(pageable);
        }
        return blogRepository.findByRole(role, pageable);
    }

}

然后,我们进入根目录,运行mvn spring-boot:run将应用run起来。所有数据会在应用启动时添加进数据库当中。然后我们访问http://localhost:8080/,我们可以得到所有blog的分页结果:

{
    "content":[
        {
            "id":246,
            "title":"blog122",
            "content":"this is teacher blog content",
            "creator":{"id":1,"username":"teacher","role":"teacher"} 
        },
        {
            "id":245,
            "title":"blog121",
            "content":"this is teacher blog content",
            "creator":{"id":1,"username":"teacher","role":"teacher"}
        },
        {
            "id":244,
            "title":"blog120",
            "content":"this is teacher blog content",
            "creator":{"id":1,"username":"teacher","role":"teacher"}
        },
        {
            "id":243,
            "title":"blog119",
            "content":"this is teacher blog content",
            "creator":{"id":1,"username":"teacher","role":"teacher"}
        },
        {
            "id":242,
            "title":"blog118",
            "content":"this is teacher blog content",
            "creator":{"id":1,"username":"teacher","role":"teacher"}
        }
    ],
    "last":false,
    "totalElements":246,
    "totalPages":50,"size":5,
    "number":0,
    "first":true,
    "sort":[{"direction":"DESC","property":"id","ignoreCase":false,"nullHandling":"NATIVE","ascending":false}],
    "numberOfElements":5
}

接着,再访问http://localhost:8080/?role=student,我们可以得到所有角色为student的用户所创建的blog的分页结果:

{
    "content":[
        {"id":123,"title":"blog122","content":"this is student blog content","creator":{"id":2,"username":"student","role":"student"}},
        {"id":122,"title":"blog121","content":"this is student blog content","creator":{"id":2,"username":"student","role":"student"}},
        {"id":121,"title":"blog120","content":"this is student blog content","creator":{"id":2,"username":"student","role":"student"}},
        {"id":120,"title":"blog119","content":"this is student blog content","creator":{"id":2,"username":"student","role":"student"}},
        {"id":119,"title":"blog118","content":"this is student blog content","creator":{"id":2,"username":"student","role":"student"}}
    ],
    "last":false,
    "totalElements":123,
    "totalPages":25,
    "size":5,
    "number":0,
    "first":true,
    "sort":[{"direction":"DESC","property":"id","ignoreCase":false,"nullHandling":"NATIVE","ascending":false}],
    "numberOfElements":5}
版权声明本文由 Cliff创作,转载需署名作者且注明文章出处
软考中级-系统集成项目管理工程师**的超详细知识点笔记。 软考中级系统集成项目管理工程师核心知识点摘要 综合知识:涵盖信息化基础(国家信息化六要素、信息系统开发方法)、系统集成特点(高技术性、团队协作)、IT服务管理(ITIL流程)、网络技术(OSI模型、TCP/IP)、信息安全(CIA三要素、加密技术)、软件工程(生命周期、测试类型)、面向对象分析与设计(UML图)、新一代信息技术(云计算、大数据、物联网)。 案例分析:聚焦项目管理十大知识领域,重点包括: 整体管理(项目章程、变更控制流程) 范围管理(WBS分解、需求跟踪矩阵) 进度管理 阅读详情

相关推荐

基于拟蒙特卡洛模拟法的随机潮流计算matlab程序

由式(4-11)可知,蒙特卡洛模拟法的计算量不受电力系统规模大小影响,因此该方法在一些复杂的电力系统中可以得到应用,包括处理电力系统中有多个间歇性新能源接入的问题,解决系统中多个节点之间相关性问题等等。本章在此基础上提出了基于拟蒙特卡洛模拟的随机潮流计算方法,并且对拟蒙特卡洛法中的拟随机数序列进行了改进,大大提高了随机潮流的计算效率。模拟法的具体思路如下:基于实际工程问题的求解需要,建立与之相对应的随机模拟过程和随机概率模型,使得它们的参数,包括概率分布或者数学期望,能够等于问题的实际解;

weixin_47365903的博客 1790

Spring Data JPA 自定义sql @Query注解的用法 Kaki的博客

Spring Data JPA的前两篇已经写了通过方法名格式自动生成SQL,也简单的提到了@Query注解。但是往往真正的业务逻辑里面,这些是完全不够用的,涉及到一些稍微复杂一点的查询就会有点问题,如根据一组条件中的某几个条件查询(条件不固定),然后再加上分页、排序,这个时候只是使用之前的方法就有点捉襟见肘啦。 这篇博客的篇幅不会很长,主要是讲两个点,一个是在Spring Data JPA系列的第一篇博客中提到的@Query注解,一个就是通过Specification组合动态条件以及Pageable和So

qq_44988088的博客 5131

告别黑盒调试:用MMSegmentation可视化工具链,从训练到评估一目了然

本文介绍了如何利用MMSegmentation的可视化工具链,从训练到评估实现语义分割模型的透明化调试。通过整合日志分析、混淆矩阵、PR曲线等工具,开发者可以快速定位模型问题,优化性能。文章详细展示了训练曲线分析、性能剖析、混淆矩阵解读和PR曲线应用等关键步骤,帮助用户告别黑盒调试,提升模型开发效率。

weixin_29100927的博客 102

jpa @query 动态表名

数据库分表 这里是用修改spring源码方式 #{#entityName} 默认为 实体类@Entity注解的value值,会修改了其中实现 @Query(nativeQuery=true,value="delete from #{#entityName} where mobile=:#{#mobile}") int deleteByMobile(@Param("entityName")String entityName,@Param("mobile")String mobile); 主要修改类:(

zjh1n795的专栏 4390

告别手动点鼠标:用Python脚本批量跑ADS版图仿真,效率提升10倍(附完整代码)

本文详细介绍了如何利用Python脚本自动化ADS版图仿真流程,显著提升射频工程师的工作效率。通过调用ADS底层接口,实现参数化修改、批量任务调度和结果自动收集,解决了手动操作中的常见问题,如仿真不更新等。附完整代码,帮助开发者快速实现10倍效率提升。

weixin_42523543的博客 331

Android - 蓝牙开发

文章目录科普SIG类型制式编程Classic BluetoothBluetooth Low Energy蓝牙的UUID是什么?有什么用? 科普 https://zh.wikipedia.org/wiki/%E8%97%8D%E7%89%99 蓝牙(英语:Bluetooth),一种无线通讯技术标准,用来让固定与移动设备,在短距离间交换资料,以形成个人局域网(PAN)。其使用短波特高频(UHF)无线电波,经由 2.4 至 2.485 GHz 的 ISM(工业、科学、医疗)频段来进行通信。1994 年由电信商

qq_43323826的博客 1万+

JPA @Query查询 动态表名

问题遇到的现象和发生背景 BFCUSTOMITEM2022 这张表后缀是年度,每年都会使用新的表 问题相关代码,请勿粘贴截图 @Query(value = "SELECT f.CUSITEMCODE FROM BFCUSTOMITEM2022 f WHERE f.ID = ?1", nativeQuery = true) String queryAccountingProgramCode(Str...

2023年最新地推相关信息 1608

logisim实验——通过2个半加器实现1-bit全加器,通过4个一位全加器构成4-bit加法器(详解)

一、由异或门和与门所构成的半加器: 二、由两个半加器构成的1-bit全加器: ..

zep 1万+

Spring Data JPA 框架使用自定义(@Query)的查询语句返回自定义的实体对象踩坑记录

使用Spring Data Jpa,根据业务需求,有时候需要进行复杂的数据查询,并返回我们需要的字段(例如分类统计,目前框架下不需好实现),而在该框架下,目前仅仅支持返回数据库映射进行持久化的实体类(使用注解@Entity的类)。虽然在框架上我们可以使用@Query注解执行我们自定义的sql语句,但是其返回值为:List&lt;Object[]&gt; 类型,多个Object[]的List集合。 ...

tt____tt的专栏 1万+

LangChain4j-针对性操作Function-call+系统预设角色

如果我们想要对一些敏感信息进行针对化的操作,不仅仅是接口大模型去进行回复。比如我们现在数据库里面有一些菜品,那么用户提问,店里有多少套餐,那么云端大模型肯定是不知道的,我们希望捕获这些关键字然后进行自己的业务查询或者处理,这个时候就可以使用function-call。

DDDDDouble的博客 453

gitlab远程子仓库配置SSH - 保姆级教程

在网上搜索了一些方法,但是不够详细,走了好多弯路,所以记录下配置SSH的详细过程吧。

是菠萝的博客 1万+

Spring Data Jpa的自定义查询@Query

@query使用

Tiger_Paul的博客 1475

matlab从无到有系列(九):Simulink基础仿真详解(全网最全,从入门到放弃)

🔗 运行环境:Matlab 🚩 作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 📚 选自专栏:《数学建模》 🧿 优秀专栏:《Matlab神经网络案例分析》 目前持续更新的专栏: 🥇 专栏:Matlab GUI编程技巧 🔥 专栏:Matlab从无到有系列 📚 专栏:《数学建模》 💗 大家好,我是左手の明天!💗 📆 最近更新:2022 年 4 月 2 日,左手の明天的第215 篇原创博客 🌟🌟往期必看🌟🌟 matlab从无到有系列(二):矩阵运算基础...

左手の明天的博客 9万+

【SpringBoot框架篇】11.Spring Data Jpa实战

文章目录简介JPASpring Data JpaHibernateJpa、Spring Data Jpa、Hibernate三者之间的关系应用实战引入依赖配置文件实体类常用注解@Entity和@Table@Id和@GeneratedValue@Column@Transient继承超类的通用字段属性@MappedSuperclass@Inheritance审计功能启用审计功能在启动类里添加注解在需要使用的类上面添加审计监听器审计功能注解添加审计人 简介 首先了解一下 JPA,Spring Data Jpa,之

皓亮君的博客 4335

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jpa怎么传参到in中_关于spring data jpa的@query的传入参数是对象怎么匹配参数

/*** Specifies methods used to obtain and modify person related information* which is stored in the database.* @author Petri Kainulainen*/public interface PersonRepository extends JpaRepository {/*** ...

weixin_29432863的博客 2100

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Spring Data JPA

构建内容 构建一个应用程序,该应用程序将POJO(普通旧Java对象)存储在基于内存的数据库中。 一.Spring Initializr 预初始化项目 手动初始化项目: 导航到https://start.spring.io.此服务提取应用程序所需的所有依赖项,并为您完成大部分设置。 选择 Gradle 或 Maven 以及您要使用的语言。本指南假定您选择了 Java。 单击依赖关系,然后选择 Spring Data JPA,然后选择 H2 数据库。 单击"生成"。 下载生成的 ZIP 文

龙梓琦的博客 1188

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Spring Data JPA创建查询的三种方式

JPA JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 下面介绍Spring Data JPA中的三种创建查询的方式。 通过解析方法名创建查询 框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find、findBy、read、readBy、get、getB...

wunianisme的博客 1152

Spring Data JPA设计模式

Pure JPA public interface UserRepository extends JpaRepository<User,Long>{ } 这就是UserRepository不用写任何方法的原因。Spring Data JPA主要通过方法签名来为UserRepository实现功能。 使用这种途径可以使用的方式包括@Query和通过遵循Spring Data JPA的...

oneslide 1045

Spring Data JPA介绍理解入门

spring JPA理解入门spring data jpa介绍添加spring-data-jpa的支持编写Repository接口 spring data jpa介绍 首先了解JPA是什么? JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO等ORM框架各自为营的局面。值得注意的是,

loveinfree的专栏 174

用@Query标注自定义查询语句用原生sql查询符合时间要求的数据与分页等功能

这个星期在学这开发API接口,其中数据库操作均使用JPA,以下对我遇到的业务逻辑里的一些数据库操作进行小总结,以备参考。

crystalu3的博客 1万+

Spring整合Hibernate实现Spring Data JPA

在上一篇文章《Spring整合Hibernate实现JPA持久化》中,我们已经介绍了怎样在Spring容器中合理地集成Hibernate来实现JPA的ORM机制。但是,细心的读者会发现,上一篇文章中使用了EntityManager来直接与数据库交互,存在这一定的耦合度,更重要的是每当新增或修改新的实体Entity的管理时,都需要重复的实现EntityManager在Dao层的逻辑,有些过于模版化,...

lgxzzz的博客 222

JPA规范总结和整理

JPA相关使用和基础知识

Willow的博客 2832

Spring_spring data jpa 的简单使用

spring data jpa 的简单使用 先说简单一下JPA 概念:JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。 影响:他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO等ORM框架各自为营的局面 好处:spring data jpa让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现 Spring DATA

T_Tonz的博客 406

Jpa Repository使用自定义sql

1. 使用@Query对接口方法简单标注为jpql查询@Query("select u from User u where u.sex=:sex") public List<User> getUsersBySex(@Param("sex") String sex); @Query("select u from User u where u.sex=?1") public List<User> get

blurooo的博客 3万+
上一篇: Spring Data Jpa: 分页和排序
下一篇: [AngularJS] EasyModal - alert - confirm - modal
daniel7443
博客等级 码龄24年 32粉丝 1原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值