当前位置: 首页 > news >正文

Spring Boot 3.3 【五】Spring Boot 整合JPA-原生SQL支持

在使用JPA(Java Persistence API)时,虽然它主要通过对象而不是SQL语句来操作数据库,但在处理复杂查询时,我们有时仍需要直接使用SQL。这可以通过 @Query 注解在 Repository 接口中实现。以下是一个使用Spring Data JPA和原生SQL来处理复杂数据库查询的实例。

一、查询用户及其订单信息

假设我们有两个表:usersorders,其中 orders 表通过 user_id 字段与 users 表关联。

二、数据库表结构

  • users
    • id INT
    • name VARCHAR
    • email VARCHAR
  • orders
    • id INT
    • user_id INT
    • order_date DATE
    • amount DECIMAL

三、创建JPA实体

1. User 实体类

package com.jsglxx.demo.entity;import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;@Entity  
public class User {  @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  private Long id;  private String name;  private String email;  public User() {super();}// getters and setters  public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public User(Long id, String name, String email) {super();this.id = id;this.name = name;this.email = email;}}  

2. Orders 实体类

注意:orderMysql 排序的保留关键字,不能使用。

package com.jsglxx.demo.entity;import java.math.BigDecimal;
import java.util.Date;import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;@Entity  
public class Orders {  @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  private Long id;  private Long userId;  private Date orderDate;  private BigDecimal amount;  public Orders() {super();}// getters and setters  public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Long getUserId() {return userId;}public void setUserId(Long userId) {this.userId = userId;}public Date getOrderDate() {return orderDate;}public void setOrderDate(Date orderDate) {this.orderDate = orderDate;}public BigDecimal getAmount() {return amount;}public void setAmount(BigDecimal amount) {this.amount = amount;}public Orders(Long id, Long userId, Date orderDate, BigDecimal 			amount) {super();this.id = id;this.userId = userId;this.orderDate = orderDate;this.amount = amount;}}

四、 创建 Repository 接口

package com.jsglxx.demo.repository;import java.util.List;import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;import com.jsglxx.demo.entity.User;public interface UserRepository extends JpaRepository<User, Long> {  @Query(value = "SELECT u.*, o.* FROM user u INNER JOIN orders o ON u.id = o.user_id WHERE u.name = ?1", nativeQuery = true)  List<Object[]> findUserWithOrdersByName(String name);  }
  • 返回类型 List<Object[]> 中的 Object[] 表示每行结果是一个对象数组,其中包含了 usersorders 表中对应列的值。
  • 对于更复杂的查询,考虑使用 DTO(Data Transfer Object) 来映射查询结果,使代码更加清晰。

五、 Service 调用

package com.jsglxx.demo.service;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import com.jsglxx.demo.repository.UserRepository;@Service  
public class UserService {  @Autowired  private UserRepository userRepository;  public List<Object[]> getUserWithOrdersByName(String name) { return userRepository.findUserWithOrdersByName(name);  }  
}

六、 Controller 调用

@RestController  
@RequestMapping("/users")  
public class UserController {  @Autowiredprivate UserService userService;//根据用户姓名查询订单信息@GetMapping("/{name}")public List<Object[]> getUserWithOrdersByName(@PathVariable String name){return this.userService.getUserWithOrdersByName(name);}
}

七、测试

1、插入模拟数据

在这里插入图片描述
在这里插入图片描述

2、使用 postman 测试

在这里插入图片描述

八、总结

通过上述示例,可以掌握如何在Spring Data JPA中使用原生SQL来处理复杂的数据库查询。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 萝卜快跑和端到端的自动驾驶(1)
  • mysql 之 explain
  • c语言基础-------数组元素的指针
  • 2024新型数字政府综合解决方案(七)
  • Apache Doris 中Compaction问题分析和典型案例
  • drawio的问题
  • 24 初入python
  • ECMAScript性能优化技巧与陷阱
  • 【线性代数】几种行/列向量相乘的情况讨论
  • 基于vue全家桶的pc端仿淘宝系统_kebgy基于vue全家桶的pc端仿淘宝系统_kebgy--论文
  • 100个练习学习Rust!可变性・循环・溢出
  • IIS发布打包后文件
  • 【软件测试】如何用python连接Linux服务器
  • 前端宝典之六:React源码解析之lane模型
  • Android MVVM框架详解与应用
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • codis proxy处理流程
  • ES6语法详解(一)
  • ES6之路之模块详解
  • Java IO学习笔记一
  • jquery cookie
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • web标准化(下)
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 正则与JS中的正则
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #、%和$符号在OGNL表达式中经常出现
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (16)Reactor的测试——响应式Spring的道法术器
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (python)数据结构---字典
  • (阿里云万网)-域名注册购买实名流程
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (四) 虚拟摄像头vivi体验
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (五)网络优化与超参数选择--九五小庞
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一) springboot详细介绍
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • .NET 中的轻量级线程安全
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET下的多线程编程—1-线程机制概述
  • /bin/rm: 参数列表过长"的解决办法
  • @31省区市高考时间表来了,祝考试成功
  • @JsonFormat 和 @DateTimeFormat 的区别
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [100天算法】-二叉树剪枝(day 48)
  • [BT]BUUCTF刷题第8天(3.26)
  • [C]编译和预处理详解