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请求体reqJsonpageable(前端框架自带了,这个其实是请求url?后的pagesize参数决定的)
(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对应

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/134484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Notepad++中删除连续的任意n行

使用Notepad里的行标记功能&#xff0c;可以删除指定的任意n行。 案例1&#xff0c;删除sample2.dat里的第201行到第10000行。方法如下&#xff1a; (1) 用户NotePad打开sample2.dat&#xff0c;右击201行 —》“开始/结束”/开始 图(1) 选择行的起点&#xff1a;201 (2) 接…

JS的内存泄漏详解

介绍&#xff1a; js中的内存垃圾回收机制&#xff1a;垃圾回收器会定期扫描内存&#xff0c;当某个内存中的值被引用为零时就会将其回收。当前变量已经使用完毕但依然被引用&#xff0c;导致垃圾回收器无法回收这就造成了内存泄漏。传统页面每次跳转都会释放内存&#xff0c;…

做什么数据表格啊,要做就做数据可视化

是一堆数字更易懂&#xff0c;还是图表更易懂&#xff1f;很明显是图表&#xff0c;特别是数据可视化图表。数据可视化是一种将大量数据转化为视觉形式的过程&#xff0c;通过图形、图表、图像等方式呈现数据&#xff0c;以便更直观地理解和分析。 数据可视化更加生动、形象地…

Linux内核分析(八)--用户/内核缓冲区及磁盘高速缓存

目录 一、引言 二、缓冲区 ------>2.1、缓冲区介绍 ------>2.2、缓冲区类型 ------------>2.2.1、行缓冲 ------------>2.2.2、全缓冲 ------------>2.2.3、无缓冲 ------>2.3、内核缓冲区 ------------>2.3.1、数据预读(cache) ------------&g…

蓝桥杯每日一题203.11.7

题目描述 题目分析 使用dp思维&#xff0c;当前位置是否可行是有上一位置推来&#xff0c;计算出最大的可行位置即可 #include <stdio.h> #include <string.h>#define N 256 int f(const char* s1, const char* s2) {int a[N][N];int len1 strlen(s1);int len2 …

kafka笔记要点和集群安装、消息分组、消费者分组以及与storm的整合机制

kafka笔记 1/kafka是一个分布式的消息缓存系统 2/kafka集群中的服务器都叫做broker 3/kafka有两类客户端&#xff0c;一类叫producer&#xff08;消息生产者&#xff09;&#xff0c;一类叫做consumer&#xff08;消息消费者&#xff09;&#xff0c;客户端和broker服务器之间…

【分布式事务】初步探索分布式事务的概率和理论,初识分布式事的解决方案 Seata,TC 服务的部署以及微服务集成 Seata

文章目录 一、分布式服务案例1.1 分布式服务 demo1.2 演示分布式事务问题 二、分布式事务的概念和理论2.1 什么是分布式事务2.2 CAP 定理2.3 BASE 理论2.4 分布式事务模型 三、分布式事务解决方案 —— Seata3.1 什么是 Seata3.2 Seata 的架构3.3 Seata 的四种分布式事务解决方…

AIGPT重大升级,界面重新设计,功能更加饱满,用户体验升级

AIGPT AIGPT是一款功能强大的人工智能技术处理软件&#xff0c;不但拥有其他模型处理文本认知的能力还有AI绘画模型、拥有自身的插件库。 我们都知道使用ChatGPT是需要账号以及使用魔法的&#xff0c;实现其中的某一项对我们一般的初学者来说都是一次巨大的挑战&#xff0c;但…

Fourier分析导论——第4章——Fourier级数的一些应用(E.M. Stein R. Shakarchi)

第 4 章 傅里叶级数的一些应用 Fourier series and analogous expansions intervene very naturally in the general theory of curves and surfaces. In effect, this theory, conceived from the point of view of analysis, deals obviously with the study of arbitra…

三款软件录制电脑屏幕视频

在这个视频信息快速发展的新时代&#xff0c;寻找好用的可以录制电脑屏幕视频的软件变得极其重要&#xff0c;因为制作视频已成为我们生活工作中不可或缺的一部分。 这些好用的录屏软件允许你录制摄像头、特定窗口、部分区域或整个桌面&#xff0c;同时还可对录制中的视频进行…

前沿技术:人工智能的未来之路

&#x1f38a;专栏【人工智能】 &#x1f33a;每日一句&#xff1a;天空黑暗到一定程度&#xff0c;星辰就会熠熠生辉&#xff01; ⭐欢迎并且感谢大家指出我的问题 文章目录 一、引言 二、人工智能的未来发展 三、人工智能发展面临的挑战 四、结论 一、引言 随着科技的不…

lvgl加载资源JPG image,播放动画

load jpg image to memory lvgl加载图片资源解码时间比较长&#xff0c;可以预先缓存到缓存中。 本方案时候lvgl&#xff0d;&#xff17;&#xff0c;下面是参考 Images — LVGL documentation 实施&#xff1a; lv_img_cache_set_size(cachecount);  //设置缓存的图片…

算法通关村第七关|黄金挑战|迭代实现二叉树的前、中、后序遍历

1.迭代实现前序遍历 public List<Integer> preOrderTraversal(TreeNode root) {List<Integer> res new ArrayList<Integer>();if (root null) {return res;}Deque<TreeNode> stack new LinkedList<TreeNode>();TreeNode node root;while (!…

开源项目管理工具Helper的安装及汉化

什么是 Helper &#xff1f; Helper 是基于 Laravel 和 Filament 的开源项目管理工具。 官方提供了在线演示&#xff1a;https://project-helper.net 安装 在群晖上以 Docker 方式安装。 数据库理论上是可以使用群晖自带的 MariaDB 的&#xff0c;但老苏为了省事&#xff0c…

数据结构与算法:队列栈BFSDFS

诸神缄默不语-个人CSDN博文目录 我和ChatGPT一起制作了一个框架&#xff0c;现在只填充了一部分&#xff0c;具体的在补了。 在复杂数据结构的学习路线图中&#xff0c;队列和栈是两种基础且重要的数据结构&#xff0c;它们是广度优先搜索&#xff08;BFS&#xff09;和深度优…

GIT 遇到问题

GIT 遇到问题 > git pull --tags From https://gitee.com/gdgmzwx/react-project-demo* [new branch] master -> origin/master There is no tracking information for the current branch. Please specify which branch you want to merge with. See git-pull(…

千兆光模块和万兆光模块的发展前景与市场分析

随着互联网技术的不断发展&#xff0c;千兆光模块和万兆光模块作为网络传输的核心部件&#xff0c;在数据传输领域已得到广泛的应用。本文将从发展历程、市场前景和应用案例三个方面详细分析千兆光模块和万兆光模块的优势和未来发展前景。 一、千兆光模块和万兆光模块的发展历…

WPF中的Binding的常见知识点与技巧

完全来源于十月的寒流&#xff0c;感谢大佬讲解 在XAML中&#xff0c;可以绑定到许多不同类型的数据源和属性。以下是一些可以绑定的常见数据源和属性&#xff1a; 属性&#xff1a;可以绑定到对象的属性&#xff0c;例如控件的Text、Visibility、IsEnabled等属性。 集合&am…

【网络】五中IO模型介绍 + 多路转接中select和poll服务器的简单编写

高级IO 前言正式开始前面的IO函数简单过一遍什么叫做低效的IO钓鱼的例子同步IO和异步IO五种IO模型阻塞IO非阻塞IO信号驱动多路转接异步IO 小结 代码演示非阻塞IO多路转接select介绍简易select服务器timeout 为 nullptrtimeout 为 {0, 0}timeout 为 {5, 0}调用accept select编写…

第二证券:消费电子概念活跃,博硕科技“20cm”涨停,天龙股份斩获10连板

消费电子概念7日盘中再度拉升&#xff0c;到发稿&#xff0c;博硕科技“20cm”涨停&#xff0c;光大同创、波长光电涨超10%&#xff0c;易德龙、向阳科技、得润电子、天龙股份、同兴达等涨停。 博硕科技强势涨停&#xff0c;公司昨日在接受安排调研时表明&#xff0c;公司从上…