jpa Repository的常用写法总结
一、前言
之前项目在xml中写sql,感觉标签有很多,比较灵活;
最近在写新项目,使用了jpa,只能在java中写sql了,感觉不太灵活,但是也得凑付用。
以下总结下常用入参出参写法。
二、Repository代码样例
@SuppressWarnings("unused")
@Repository
public interface HourRepository extends JpaRepository<Dlhour, Long>, JpaSpecificationExecutor<Dlhour> {@Query(value = "SELECT * " +"FROM dlhour d,bsc_user_t A " +"WHERE A.user_name = d.ename AND A.user_identity = '0' " +"and IF(?1 !='' and ?1 is not null , A.user_name = ?1 ,1=1 ) " +"and IF(?2 !='' and ?2 is not null,A.`NAME` LIKE concat('%', ?2, '%') ,1=1 ) " +"and IF(?3 !='' and ?3 is not null , d.fact_startdate >= ?3 ,1=1 ) " +"and if(COALESCE(?4,NULL) IS NOT NULL, A.company in (?4) ,1=1 ) " +"GROUP BY user_id ", countQuery = "SELECT count(*) " +"FROM dlhour d,bsc_user_t A " +"WHERE A.user_name = d.ename AND A.user_identity = '0' " +"and IF(?1 !='' and ?1 is not null , A.user_name = ?1 ,1=1 ) " +"and IF(?2 !='' and ?2 is not null,A.`NAME` LIKE concat('%', ?2, '%') ,1=1 ) " +"and IF(?3 !='' and ?3 is not null , d.fact_startdate >= ?3 ,1=1 ) " +"and if(COALESCE(?4,NULL) IS NOT NULL, A.company in (?4) ,1=1 ) " +"GROUP BY user_id ", nativeQuery = true)Page<Map<String, Object>> findClassHour(String user_name, String name, String fact_startdate, List<String> companys, Pageable pageable);}
说明:
1.这是一个根据条件查询结果列表的接口,有分页,有入参pageable(不用自己手写分页了)
2.Dlhour是javabean,与数据库中的一张表对应,字段一一对应,注意必须有id列。
3.user_name是第一个入参,放入sql中就是等于的条件
4.name是第二个入参,放入sql中可以模糊查询
5.fact_startdate是第三个入参,可以用来查询时间范围,string类型就可以,例如2023-11-06
6.companys是第四个入参,是List<String>类型,放入sql用来查询in条件
三、其余部分代码样例
1.Service层
@Service
public class ClassHourService {private final Logger log = LoggerFactory.getLogger(ClassHourService.class);@Autowiredprivate HourRepository hourRepository;public Page<Map<String, Object>> findClassHour(JSONObject reqJson, Pageable pageable) {List<String> companys = null;String company = reqJson.getString("company");if(company!=null && !"".equals(company)){companys = Arrays.asList(company.split(","));}return hourRepository.findClassHour(reqJson.getString("user_name"), reqJson.getString("name"), reqJson.getString("fact_startdate"), companys, pageable);}
}
说明:
(1)前端传来的参数company,是逗号分隔的,转为List<String>类型的companys,当入参
(2)直接从前端传来的json报文中拿到user_name, name, fact_startdate参数
(3)pageable参数是前端传来的(好像在header里),直接传下去
2.Controller层
@RestController
@RequestMapping("/first")
public class ClassHourResource {private final Logger log = LoggerFactory.getLogger(ClassHourResource.class);@Autowiredprivate ClassHourService classHourService;@GetMapping("/second/findClassHour")public ResponseEntity<List<Map<String,Object>>> findClassHour(@RequestBody JSONObject reqJson, Pageable pageable) {log.debug("REST request to findClassHour: {}", reqJson.toJSONString());Page<Map<String,Object>> page = classHourService.findClassHour(reqJson, pageable);HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/first/second/findClassHour");return ResponseEntity.ok().headers(headers).body(page.getContent());}}
说明:
(1)入参是json请求体reqJson,pageable(这个应该在header里,前端框架自带了)
(2)然后把参数扔到service层,获取返回值
(3)使用PaginationUtil获取了一个响应头headers,里面包含总页数、当前页数等前端框架需要的信息(这些信息在响应header里)
(4)最后把查询到的数据放入响应体(格式可以认为是JsonArray),返回给前端
3.PaginationUtil样例
import org.springframework.data.domain.Page;
import org.springframework.http.HttpHeaders;
import org.springframework.web.util.UriComponentsBuilder;public final class PaginationUtil {private PaginationUtil() {}public static <T> HttpHeaders generatePaginationHttpHeaders(Page<T> page, String baseUrl) {HttpHeaders headers = new HttpHeaders();headers.add("X-Total-Count", Long.toString(page.getTotalElements()));String link = "";if ((page.getNumber() + 1) < page.getTotalPages()) {link = "<" + generateUri(baseUrl, page.getNumber() + 1, page.getSize()) + ">; rel=\"next\",";}// prev linkif ((page.getNumber()) > 0) {link += "<" + generateUri(baseUrl, page.getNumber() - 1, page.getSize()) + ">; rel=\"prev\",";}// last and first linkint lastPage = 0;if (page.getTotalPages() > 0) {lastPage = page.getTotalPages() - 1;}link += "<" + generateUri(baseUrl, lastPage, page.getSize()) + ">; rel=\"last\",";link += "<" + generateUri(baseUrl, 0, page.getSize()) + ">; rel=\"first\"";headers.add(HttpHeaders.LINK, link);return headers;}private static String generateUri(String baseUrl, int page, int size) {return UriComponentsBuilder.fromUriString(baseUrl).queryParam("page", page).queryParam("size", size).toUriString();}
}
说明:
(1)这个方法大概就是把总页数、当前页等信息放入响应头,供前端框架使用
(2)前端框架是react antd框架
(3)对应的这个方法也是后端框架自己封装的,与前端antd对应
相关文章:
jpa Repository的常用写法总结
一、前言 之前项目在xml中写sql,感觉标签有很多,比较灵活; 最近在写新项目,使用了jpa,只能在java中写sql了,感觉不太灵活,但是也得凑付用。 以下总结下常用入参出参写法。 二、Repository代…...
笔记本电脑 禁用/启用 自带键盘
现在无论办公还是生活 很多人都会选择笔记本电脑 但很多人喜欢机械键盘 或者 用一些外接键盘 但是很多时候我们想操作 会碰到笔记本原来的键盘导致错误操作 那么 我们就需要将笔记本原来的键盘禁用掉 我们先以管理员身份运行命令窗口 然后 有两个命令 禁用默认键盘 sc conf…...
基于 golang 从零到一实现时间轮算法 (三)
引言 本文参考小徐先生的相关博客整理,项目地址为: https://github.com/xiaoxuxiansheng/timewheel/blob/main/redis_time_wheel.go。主要是完善流程以及记录个人学习笔记。 分布式版实现 本章我们讨论一下,如何基于 redis 实现分布式版本的…...
k8s 1.28安装
容器运行时,containerd 按照官方的指导,需要安装runc和cni插件,提示的安装方式,有三种: 二进制安装包源码apt-get 或 dnf安装 我们这里选用第三种,找到docker官方提供的安装方式 ubuntu-containerd # A…...
安装anaconda时控制台conda-version报错
今天根据站内的一篇博客教程博客在此安装anaconda时,检查conda版本时报错如下: >>>>>>>>>>>> ERROR REPORT <<<<<<<<<<<< Traceback (most recent call last): File “D:\An…...
链表(1)
目录 单链表 主函数test.c test1 test2 test3 test4 头文件&函数声明SList.h 函数实现SList.c 打印SLPrint 创建节点CreateNode 尾插SLPushBack 头插SLPushFront 头删SLPopBck 尾删SLPopFront 易错点 本篇开始链表学习。今天主要是单链表&OJ题目。 单链…...
智慧农业:农林牧数据可视化监控平台
数字农业是一种现代农业方式,它将信息作为农业生产的重要元素,并利用现代信息技术进行农业生产过程的实时可视化、数字化设计和信息化管理。能将信息技术与农业生产的各个环节有机融合,对于改造传统农业和改变农业生产方式具有重要意义。 图扑…...
知识注入以对抗大型语言模型(LLM)的幻觉11.6
知识注入以对抗大型语言模型(LLM)的幻觉 摘要1 引言2 问题设置和实验2.1 幻觉2.2 生成响应质量 3 结果和讨论3.1 幻觉3.2 生成响应质量 4 结论和未来工作 摘要 大型语言模型(LLM)内容生成的一个缺点是产生幻觉,即在输…...
机器人物理交互场景及应用的实际意义
机器人物理交互场景是指机器人与物理世界或人类进行实际的物理互动和交互的情境。这些场景涉及机器人在不同环境和应用中使用其物理能力,以执行任务、提供服务或与人类互动。 医疗协助: 外科手术助手:机器人可以用于外科手术,提供…...
Kubernetes Dashboard 用户名密码方式登录
Author:rab 前言 为了 K8s 集群安全,默认情况下 Dashboard 以 Token 的形式登录的,那如果我们想以用户名/密码的方式登录该怎么操作呢?其实只需要我们创建用户并进行 ClusterRoleBinding 绑定即可,接下来是具体的操作…...
Redisson中的对象
Redisson - 是一个高级的分布式协调Redis客服端,能帮助用户在分布式环境中轻松实现一些Java的对象 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, …...
GNU ld链接器 lang_process()(二)
一、ldemul_create_output_section_statements() 位于lang_process()中11行 。 该函数用于创建与目标有关的输出段的语句。这些语句将用于描述输出段的属性和分配。 void ldemul_create_output_section_statements (void) {if (ld_emulation->create_output_section_sta…...
《国产服务器操作系统发展报告(2023)》重磅发布
11月1日,《国产服务器操作系统发展报告(2023)》(以下简称“报告”)在 2023 云栖大会上正式发布,开放原子开源基金会理事长孙文龙、中国信息通信研究院副总工程师石友康、阿里云基础软件部副总裁马涛、浪潮信…...
【PTE-day03 报错注入】
报错注入 1、报错注入 group by count2、报错注入 extractvalue3、报错注入updatexml1、报错注入 group by count http://124.222.124.9:8888/Less-5/?id=-1 union select 1,count(*),concat((select database()),ceil(rand(0)*2)) as a from information_schema.tables grou…...
jenkins gitlab CI/CD
jenkins的安装教程就不说了:Jenkins docker 一键发布 (一)_jenkins 一键发布-CSDN博客 最近打算从svn切换到gitlab,所以配置了一下jenkins的git 很简单,直接上图 1 选择 Git 2 录入gitlab的http地址(由于我的git地址不是22端口&…...
Java 中的数据类型有哪些?
Java中主要有八种基本数据类型: 1、整型:byte、short、int、long 2、字符型:char 3、浮点型:float、double 4、布尔型:boolean 一、整型 Java中整型数据属于有符号数,即第一个bit位为0表示正整数&…...
基于SSM的大学学生成长系统
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...
369B1860G0028 44A730240-G01 IC697ACC722B
369B1860G0028 44A730240-G01 IC697ACC722B 在NOA,一个名为MO(监控和优化)的独立领域与现有系统分开准备,数据直接从机器人、无人机和新传感器收集,例如腐蚀、声音和振动传感器。此外,现有系统中的数据通过OPC UA导入,…...
系列十一、拦截器(二)#案例演示
一、案例演示 说明:如下案例通过springboot的方式演示拦截器是如何使用的,以获取Controller中的请求参数为切入点进行演示 1.1、前置准备工作 1.1.1、pom <dependencies><!-- spring-boot --><dependency><groupId>org.spring…...
数据分析实战 | 关联规则分析——购物车分析
目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据预处理 七、生成频繁项集 八、计算关联度 九、可视化 一、数据及分析对象 数据集链接:Online Retail.xlsx 该数据集记录了2010年12月01日至2011年12月09日…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
