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

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(这个应该在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对应

http://www.lryc.cn/news/220954.html

相关文章:

  • 笔记本电脑 禁用/启用 自带键盘
  • 基于 golang 从零到一实现时间轮算法 (三)
  • k8s 1.28安装
  • 安装anaconda时控制台conda-version报错
  • 链表(1)
  • 智慧农业:农林牧数据可视化监控平台
  • 知识注入以对抗大型语言模型(LLM)的幻觉11.6
  • 机器人物理交互场景及应用的实际意义
  • Kubernetes Dashboard 用户名密码方式登录
  • Redisson中的对象
  • GNU ld链接器 lang_process()(二)
  • 《国产服务器操作系统发展报告(2023)》重磅发布
  • 【PTE-day03 报错注入】
  • jenkins gitlab CI/CD
  • Java 中的数据类型有哪些?
  • 基于SSM的大学学生成长系统
  • 369B1860G0028 44A730240-G01 IC697ACC722B
  • 系列十一、拦截器(二)#案例演示
  • 数据分析实战 | 关联规则分析——购物车分析
  • maven 添加 checkstyle 插件约束代码规范
  • 什么是MySQL的执行计划(Explain关键字)?
  • 编码格式科普ASCII unicode utf-8 usc-2 GB2312
  • Pycharm中新建一个文件夹下__init__.py文件有什么用
  • OracleBulkCopy c#批量插入oracle数据库的方法
  • 046_第三代软件开发-虚拟屏幕键盘
  • MySQL主从搭建,实现读写分离(基于docker)
  • uni-app android picker选择默认月份
  • Go 接口-契约介绍
  • 变压器试验VR虚拟仿真操作培训提升受训者技能水平
  • Mastering Makefile:模块化编程技巧与经验分享