利用视图实现复杂查询

在这里插入图片描述

💗wei_shuo的个人主页

💫wei_shuo的学习社区

🌐Hello World !


利用视图实现复杂查询

在这里插入图片描述

需求:需要对Excel表中导入的四列进行,精准查询(搜索符合这四列的数据),并提供预览后下载功能

实现:创建视图表将四个字段合并存储在一个字段中,搜索的时候搜索合并后视图字段,通过主键查询原表中的数据

创建一个名为 AuthCodeView 的视图。视图是一个虚拟表,它基于现有的表(在这里是 transaction_order 表)的查询结果而创建;视图可以简化复杂的查询操作,并提供一个方便的方式来访问和处理数据

transaction_order 表中的数据进行处理和格式化,生成一个新的列 authcode_splice,并将其与 unique_id 列一起包含在视图中:authcode_splice 列是通过连接 auth_codetrade_currencytrade_amountcreate_at 列的值,并使用连字符 - 进行分隔而得到

CREATE VIEW AuthCodeView AS 
SELECT CONCAT(auth_code,'-',trade_currency,'-',ROUND(trade_amount,2),'-',TO_CHAR(create_at,'YYYY/MM/DD')) AS authcode_splice, unique_id
FROM transaction_order;

Preview

  • Controller
    @PostMapping("authCodePreview")
    @ApiOperation("Auth Code 预览")
    public Result<List<AuthCodeResultPreview>> authCodePreview(@RequestParam(name = "file", required = false) MultipartFile file) {
        return Result.succ(chargebackWarnService.authCodeUploadFile(file).getPreviewList());
    }
  • Service
 public AuthCodeUpload authCodeUploadFile(MultipartFile file) {
        if (file == null) {
            throw new ManageException("上传文件不能为空");
        }
        StringJoiner joiner = new StringJoiner("<br/>");
        AuthCodeUpload res = new AuthCodeUpload();
        List<AuthCodeResultPreview> previewSuccess = new ArrayList<>();
        List<AuthCodeResultPreview> previewError = new ArrayList<>();
        List<AuthCodeFile> list;

        try {
            @Cleanup InputStream inputStream = file.getInputStream();
            String filename = file.getOriginalFilename().toLowerCase();
            if (!(filename.contains("auth") && filename.contains("code"))) {
                throw new ManageException("请传入正确的Auth Code文件上传模板");
            }
            list = analysisAuthCodeFile(AuthCodeFile.class, inputStream);
            for (AuthCodeFile bean : list) {
                AuthCodeResultPreview preview;
                if (bean.isError()) {
                    joiner.add(bean.getIndex() + ": " + bean.getErrorMessage());
                    preview = new AuthCodeResultPreview(bean.getIndex(), bean.getErrorMessage());
                    previewError.add(preview);
                } else {
                    preview = new AuthCodeResultPreview(bean.getIndex(), bean.getOrder(), bean.getAuthCode());
                    previewSuccess.add(preview);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        //文件内包含错误信息时只展示错误条数, 全部正确时展示所有,并返回总数据条数
        if (previewError.isEmpty()) {
            res.setPreviewList(previewSuccess);
            res.setTotal(previewSuccess.size());
        } else {
            res.setPreviewList(previewError);
            res.setTotal(previewError.size());
        }
        res.setMessage(joiner.toString());
        return res;
    }
    public <T extends AuthCodeFile> List<AuthCodeFile> analysisAuthCodeFile(Class<T> clazz, InputStream is) {
        List<T> list = ExcelTools.excelToList(clazz, is);
        if (list.isEmpty()) {
            throw new ManageException("文件内不包含Auth Code信息, 请传入正确文件进行导入");
        }

        List<AuthCodeFile> files = new ArrayList<>();

        //拼接四个字段进行视图查询
        List<String> searchCondition = list.stream().map(bean -> (bean.getAuthCode() == null ? "" : bean.getAuthCode()) + "-" + (bean.getTradeCurrency() == null ? "" : bean.getTradeCurrency()) + "-" + (bean.getTradeAmount() == null ? "" : bean.getTradeAmount()) + "-" + (bean.getCreateAt() == null ? "" : bean.getCreateAt())).distinct().collect(Collectors.toList());
        //查询符合要求的UniqueId
        List<String> uniqueIdList = orderRepo.listByAuthCodeSplice(searchCondition);
        //根据符合要求的UniqueId获取列表
        List<TransactionOrder> orderList = uniqueIdList.isEmpty() ? new ArrayList<>() : orderRepo.listByUniqueIds(uniqueIdList);

        for (int i = 0; i < searchCondition.size(); i++) {
            String currentAuthCode = searchCondition.get(i).split("-")[0];
            T bean = list.get(i);
            try {
                List<TransactionOrder> collectOrders = orderList.stream().filter(order -> order.getAuthCode().equals(currentAuthCode)).collect(Collectors.toList());
                //如果当前AuthCode没有订单
                if (collectOrders.isEmpty()) {
                    bean.setAuthCode(currentAuthCode);
                    bean.setOrder(null);
                    bean.setIndex(i + 1);
                    files.add(bean);
                }
                //如果当前AuthCode有订单显示到预览界面
                for (TransactionOrder order : collectOrders) {
                    AuthCodeFile authCodeFile = new AuthCodeFile(bean.getAuthCode(), bean.getTradeCurrency(), bean.getTradeAmount(), bean.getCreateAt(), bean.isError(), bean.getErrorMessage(), i + 1, order);
                    files.add(authCodeFile);
                }
            } catch (Exception e) {
                files.add(new AuthCodeFile(i + 1, e.getMessage()));
            }
        }
        return files;
    }

Download

  • Controller
@PostMapping("authCodeDownload")
@ApiOperation("Auth Code 下载")
public void authCodeUpload(HttpServletResponse response, @RequestBody AuthCodeDownloadRequest request) throws IOException {
    chargebackWarnService.authCodeDownload(response, request.getList());
}
  • Service
  public void authCodeDownload(HttpServletResponse response, List<String> list) throws IOException {
        HashSet<String> stringSet = new LinkedHashSet<>(list);
        List<String> codeList = new ArrayList<>(stringSet);

        List<AuthCodeResultDownload> downloadList =  orderRepo.getListByAuthCode(codeList);
        List<AuthCodeResultDownload> downloadSortList = new ArrayList<>();
        for (String code : codeList){
            for (AuthCodeResultDownload download : downloadList){
                if (download.getAuthCode().equals(code)) {
                    downloadSortList.add(download);
                }
            }
        }

        ExcelTools.download(response, AuthCodeResultDownload.class, downloadSortList, "AuthCodeDownload");
    }

🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——点赞👍收藏⭐️评论📝


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c#cad 创建-文本(一)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 该代码是一个用于在AutoCAD中创建文本的命令。 首先&#xff0c;通过添加using语句引用了需要使用的Autodesk.AutoCAD命名空间。 然后&#xff0c;在命名空间CreateTextInCad下定义了一个名为CreateTextCommand的类&…

C# CAD交互界面-自定义窗体(三)

运行环境 vs2022 c# cad2016 调试成功 一、引用 二、开发代码进行详细的说明 初始化与获取AutoCAD核心对象&#xff1a; Database db HostApplicationServices.WorkingDatabase;&#xff1a;这行代码获取当前工作中的AutoCAD数据库对象。在AutoCAD中&#xff0c;所有图形数…

《动手学深度学习(PyTorch版)》笔记7.1

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

数据库学习笔记2024/2/5

2. SQL 全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了 一套操作关系型数据库统一标准 2.1 SQL通用语法 在学习具体的SQL语句之前&#xff0c;先来了解一下SQL语言的通用语法。 1). SQL语句可以单行或多行书写&…

C语言中10种常见的字符串函数你都掌握了吗?

目录 ​编辑 1.strlen(字符串长度计算函数) 2.strcpy&#xff08;字符串拷贝函数&#xff09; 3.strcat&#xff08;字符串追加函数&#xff09; 4.strcmp&#xff08;字符串大小比较函数&#xff09; 5.strncpy&#xff08;有限制的字符串拷贝函数&#xff09; 6.strnca…

DevOps落地笔记-15|混沌工程:通过问题注入提高系统可靠性

上一课时介绍了通过搭建一套部署流水线&#xff0c;高效、可靠的将软件部署到测试环境以及生产环境。到目前为止&#xff0c;我们学习了从用户需求到软件部署到生产环境交付给用户的全过程。随着软件工程不断发展&#xff0c;近几年&#xff0c;出现了一种新的实践&#xff0c;…

[Angular 基础] - 指令(directives)

[Angular 基础] - 指令(directives) 这里假设已经知道如何创建 Angular 组件以及数据绑定&#xff0c;不然可以参考前两篇笔记&#xff1a; [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) 就像中文翻译一样&#xff0c;dire…

一文讲透ast.literal_eval() eval() json.loads()

文章目录 一文讲透ast.literal_eval() eval() json.loads()1. ast.literal_eval()2. eval()3. json.loads()4. 总结 一文讲透ast.literal_eval() eval() json.loads() 在Python库中&#xff0c;我们经常会遇到需要将字符串转换为相应对象或数据结构的情况。在这种情况下&#…

研究表明:论文被大V宣传后,引用次数暴涨2~3倍!

随着AI领域的迅猛发展&#xff0c;学术成果的传播方式发生了显著转变。 期刊审稿周期长&#xff0c;当你还在和审稿人battle时&#xff0c;方法先过时了。而会议虽然没有期刊长&#xff0c;但也有几个月的时间差&#xff0c;为了保护成果的创新性并扩大影响力&#xff0c;很多…

mysql-FIND_IN_SET查询优化

优化前 SELECTuser_id,user_name,real_name,PASSWORD,real_org_id,real_org_name,real_dept_id,real_dept_name, STATUS FROMsys_user WHEREis_del 0 AND find_in_set( lilong, login_user_account ) 优化后 SELECTuser_id,user_name,real_name,PASSWORD,real_org_id,real…

必须了解的mysql三大日志-binlog、redo log和undo log

背景 日志是 mysql 数据库的重要组成部分&#xff0c;记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。 作为开发&#xff0c;我们重点需要关注的是二进制日志( binlog )和事务日志(包括redo log 和 undo …

Linux应用开发---网络通信

Linux应用开发—网络通信 1 网络通信概述 Linux下的网络编程&#xff0c;我们一般称为 socket 编程&#xff0c;socket 是内核向应用层提供的一套网络编程接口&#xff0c;我们可以基于socket接口开发自己的网络相关应用程序。 1.1 socket 简介 套接字&#xff08;socket&…

ReentrantLock源码分析、LockSuppor、ReentrantReadWriteLock、锁优化的方法

ReentrantLock类图 我们看一下重入锁ReentrantLock类关系图&#xff0c;它是实现了Lock接口的类。NonfairSync和FairSync都继承 自抽象类Sync&#xff0c;在ReentrantLock中有非公平锁NonfairSync和公平锁FairSync的实现。 在重入锁ReentrantLock类关系图中&#xff0c;我们可以…

Rust-获取随机数练习案例

文章目录 前言一、取官网示例猜数字游戏玩一玩cargo checkTOML文件 二、完整代码总结 前言 Rust学习系列-获取随机数练习案例&#xff0c;基于cargo 进行案例练习&#xff0c;过程中会使用cargo check&#xff1b; cargo run&#xff1b;等命名&#xff0c;同时了解基础的let …

flask_django_python五金电商网络营销的可视化分析研究

前面部分完成了系统需求分析&#xff0c;了解到新闻数据业务方面的需求&#xff0c;系统主要分为用户管理、五金信息管理、在线留言、系统管理等功能。销的可视化研究&#xff0c;并对这些数据进行处理&#xff0c; 然后对这些数据进行可视化分析和统计。 Python 爬虫技术目前来…

linux免密登录的实现

ssh免密登录使用方便&#xff0c;关键没有了口令验证反倒规避了暴力破解或者被探测的风险。配置得当&#xff0c;使用ssh免密登录更加安全。在生产环境中应用和数据库服务器之间互相设置后使用方便&#xff0c;并且在第三方人员配置使用时不用告知对方密码。 第一步、ssh登录发…

如何在HA智能家居系统中添加HACS集成并实现异地控制家中苹果与小米设备

文章目录 基本条件一、下载HACS源码二、添加HACS集成三、绑定米家设备 ​ 上文介绍了如何实现群晖Docker部署HomeAssistant&#xff0c;通过内网穿透在户外控制家庭中枢。本文将介绍如何安装HACS插件商店&#xff0c;将米家&#xff0c;果家设备接入 Home Assistant。 基本条件…

第十三篇【传奇开心果系列】Python的OpenCV库技术点案例示例:光流估计

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例:光流估计短博文目录前言一、光流估计介绍二、Lucas-Kanade光流介绍和示例代码三、Horn-Schunck光流介绍和示例代码四、cv::calcOpticalFlowPyrLK()函数实现光流估计介绍和示例代码五、光流估计用于运动分析…

Express框架介绍—node.js

Express—Node.js 官网传送门(opens new window) 基于 Node.js 平台&#xff0c;快速、开放、极简的 Web 开发框架 Express 是用于快速创建服务器的第三方模块。 Express 初体验 基本使用 安装 Express&#xff1a; npm install express创建服务器&#xff0c;监听客户端请…

瑞萨RA6M3开发实践指南-UART实践

1.背景说明 本文是参考瑞萨RA6M3开发实践指南文章教程&#xff0c;基于瑞萨HMI-Board BSP :1.1.1 版本 RT-Thread 5.0.1 版本操作步骤进行记录&#xff0c;整理成的文档。 1.1 本章内容 使用RT-Thread Studio创建开发板的程序&#xff0c;编写UART的程序&#xff0c;实现串口…