java 根据指定字段排序(mysql)

news2024/11/26 4:39:27

需求:

查询数据的时候,由前端指定字段和排序方式进行排序。

这时候要怎么做呢? 要定义一个相应的类,排序的时候,是动态拼接的。 要考虑多个字段,不同排序方式的情况。

处理

OrderField 


import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.collections4.ListUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;

@ApiModel(value = "排序字段")
public class OrderField {
    @ApiModelProperty("排序字段")
    private String fieldName;

    @ApiModelProperty("排序方式:ASC,DESC,默认ASC")
    private SortOrder sortOrder = SortOrder.ASC;

    public OrderField(String fieldName, SortOrder sortOrder) {
        this.fieldName = fieldName;
        this.sortOrder = sortOrder;
    }

    public OrderField() {
    }

    public String getFieldName() {
        return this.fieldName;
    }

    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }

    public SortOrder getSortOrder() {
        return this.sortOrder;
    }

    public void setSortOrder(SortOrder sortOrder) {
        this.sortOrder = sortOrder;
    }

    public enum SortOrder {
        ASC("asc"), DESC("desc");

        String order;

        SortOrder(String order) {
            this.order = order;
        }

        public String getOrder() {
            return order;
        }

        public static SortOrder fromString(String op) {
            return valueOf(op.toUpperCase(Locale.ROOT));
        }
    }

    public static String setSqlOrderFields(List<OrderField> orderFields) {
        return ListUtils.emptyIfNull(orderFields).stream().filter(e -> StringUtils.isNotBlank(e.getFieldName()))
                .map(e -> e.getFieldName() + " " + e.getSortOrder()).collect(Collectors.joining(","));

    }

}

请求参数类

在请求参数类里面加上面的内容:

@Data
public class CodeModelParam {
    @ApiModelProperty("字典类型")
    private String codeType; 

    @ApiModelProperty("字典名称")
    private String mean; 

    @ApiModelProperty("状态 0SA 启用, 0SX 禁用")
    private String state;
 
    @ApiModelProperty("排序的字段和方式")
    private List<OrderField> orderFields;

}

xml

<select id="getCodeModel" parameterType="com.web.code.entity.CodeModelParam" resultMap="map">
		SELECT CODE_TYPE, CODE, MEAN, MEAN_US, REMARK, SORT_ID, STATE, TAG
		FROM CODELIST
		<where>
			<if test="codeType !=null and codeType !='' ">
				CODE_TYPE in
				<foreach collection="codeType.split(',')" open="(" close=")" item="item" separator=",">
					#{item}
				</foreach>
			</if>
			<if test="mean !=null and mean !='' ">
				AND MEAN LIKE CONCAT(CONCAT('%', #{mean}), '%')
			</if>
			<if test="state !=null and state !='' ">
				AND STATE =  #{state}
			</if>
		</where>
		<if test="orderFields != null and orderFields.size() > 0">
			ORDER BY
			<foreach collection="orderFields" item="item" index="index"  separator=",">
				#{item.fieldName} #{item.sortOrder.order}
			</foreach>
		</if>
	</select>

mapper和service:

// mapper
List<Map<String, Object> getCodeModel(CodeModelParam codeModelParam);

// service
public List<CodeModel> getCodeModels(CodeModelParam codeModelParam) {
    return codeModelMapper.getCodeModel(codeModelParam);
}

测试:

    @Test
    public void getCodeModels() {
        CodeModelParam codeModelParam = new CodeModelParam();
        codeModelParam.setCodeType("ALARM_CLASS");
        List<OrderField> orderFields = new ArrayList<>();
        OrderField orderField = new OrderField("SORT_ID", OrderField.SortOrder.fromString("DESC"));
        orderFields.add(orderField);
        codeModelParam.setOrderFields(orderFields);
        System.out.println(JSON.toJSONString(codeModelService.getCodeModels(codeModelParam)));
    }

结果:

[
	{
		"code": "1",
		"codeType": "ALARM_CLASS",
		"mean": "平台告警",
		"remark": "平台告警",
		"sortId": "11",
		"state": "0SA",
		"tag": ""
	},
	{
		"code": "2",
		"codeType": "ALARM_CLASS",
		"mean": "业务系统告警",
		"remark": "业务系统告警",
		"sortId": "2",
		"state": "0SA",
		"tag": ""
	},
	{
		"code": "21",
		"codeType": "ALARM_CLASS",
		"mean": "进程类告警",
		"remark": "进程类告警",
		"sortId": "9",
		"state": "0SA",
		"tag": ""
	},
	{
		"code": "22",
		"codeType": "ALARM_CLASS",
		"mean": "平衡类告警",
		"remark": "平衡类告警",
		"sortId": "4",
		"state": "0SA",
		"tag": ""
	},
	{
		"code": "23",
		"codeType": "ALARM_CLASS",
		"mean": "阀值类告警",
		"remark": "阀值类告警",
		"sortId": "5",
		"state": "0SA",
		"tag": ""
	}, 
	{
		"code": "82",
		"codeType": "ALARM_CLASS",
		"mean": "文件积压告警",
		"remark": "文件积压告警",
		"sortId": "11",
		"state": "0SA",
		"tag": ""
	} 
]

结果并没有根据相应的进行排序。看了下日志:

 Preparing: SELECT CODE_TYPE, CODE, MEAN, MEAN_US, REMARK, SORT_ID, STATE, TAG FROM CODELIST WHERE CODE_TYPE in ( ? ) ORDER BY ? ? 
 Parameters: ALARM_CLASS(String), SORT_ID(String), desc(String)

看着也好像没啥问题。 把内容放到sql那边执行下。就发现问题了。

SELECT * FROM codelist WHERE code_type = 'ALARM_CLASS' ORDER BY 'SORT_ID' 'DESC';

因为xml那边用的是 

#{item.fieldName} #{item.sortOrder.order}

这样解析的时候,就变成字符串了, 实际并无法生效。

再处理: 

        <if test="orderFields != null and orderFields.size() > 0">
			ORDER BY
			<foreach collection="orderFields" item="item" index="index"  separator=",">
				${item.fieldName} ${item.sortOrder.order}
			</foreach>
		</if>

再测试,输出的结果是:

Preparing: SELECT CODE_TYPE, CODE, MEAN, MEAN_US, REMARK, SORT_ID, STATE, TAG FROM CODELIST WHERE CODE_TYPE in ( ? ) ORDER BY SORT_ID desc 
Parameters: ALARM_CLASS(String)

 这样就符合要求了。

总结:

        在使用动态拼接字段的时候,mybatis里面要用$进行处理,如果是#的话,是字符串,里面包含要查询的字段,就不生效了。 这个要多注意!!!

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

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

相关文章

基于matlab的ADC输入动态范围测量代码

如图&#xff0c;本文主要分享基于matlab的ADC输入数据有效位分析的代码。 fidfopen(C:\Users\Administrator\Desktop\Test.txt,r); % numptinput(Data Record Size (Number of Points)? );% fclkinput(Sampling Frequency (MHz)? ); numpt16384; fclk50; numbit14; [v1]fs…

SDK案例记录

目前的极简配置 注意事项 默认的属性配置中&#xff0c;大多采用环境变量的形式&#xff0c;方便不同设备通用 比如“常规”->“输出目录”为 $(SolutionDir)..\bin\win_msvc2017$(Platform)\$(Configuration)\案例运行前的配置&#xff08;除MwBatchSimPlugin&#xff0…

华丽家族股东大会21项议案全被否

5月17日晚间&#xff0c;A股上市公司华丽家族发布关于收到上海证券交易所监管工作函的公告&#xff0c;交易所对相关事项提出监管要求。 在此之前&#xff0c;华丽家族当天召开股东大会&#xff0c;21项股东大会议案全部未通过。历史上&#xff0c;股东大会议案全部被否的情形…

『python爬虫』24. selenium之无头浏览器-后台静默运行(保姆级图文)

目录 1. 无头浏览器2. 分析被爬取数据的网页结构3. 完整代码总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 1. 无头浏览器 一般性的selenium会打开浏览器页面&#xff0c;展示图形化页面给我们看&#xff0c;我…

Spring Boot注入Servlet、Filter、Listener 注解方式和使用RegistrationBean二种方式 加源码分析

目录 Spring Boot 注入Servlet、Filter、Listener 官方文档 基本介绍 应用实例1-使用注解方式注入 创建/Servlet_.java 修改Application.java , 加入ServletComponentScan 完成测试 创建Filter_.java 创建static/css/t.css, 作为测试文件 完成测试, 注意观察后台 注…

【数据结构】--- 博主拍了拍你并向你扔了一“棵”二叉树(概念+结构)

文章目录 前言&#x1f31f;一、树概念及结构&#xff1a;&#x1f30f;1.1树的概念&#xff1a;&#x1f30f;1.2树的相关概念&#xff1a;&#x1f30f;1.3树的表示&#xff1a;&#x1f4ab;1.3.1左孩子右兄弟表示法&#xff1a;&#x1f4ab;1.3.2双亲表示法&#xff1a; &…

Golang每日一练(leetDay0069) 数字范围按位与、快乐数

目录 201. 数字范围按位与 Bitwise-and-of-numbers-range &#x1f31f;&#x1f31f; 202. 快乐数 Happy Number &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每…

美团前高级测试工程师教你如何使用web自动化测试

一、自动化测试基本介绍 1 自动化测试概述&#xff1a; 什么是自动化测试&#xff1f;一般说来所有能替代人工测试的方式都属于自动化测试&#xff0c;即通过工具和脚本来模拟人执行用例的过程。 2 自动化测试的作用 减少软件测试时间与成本改进软件质量 通过扩大测试覆盖率…

python随机生成数据并用双y轴绘制两条带误差棒的折线图

python绘图系列文章目录 往期python绘图合集: python绘制简单的折线图 python读取excel中数据并绘制多子图多组图在一张画布上 python绘制带误差棒的柱状图 python绘制多子图并单独显示 python读取excel数据并绘制多y轴图像 python绘制柱状图并美化|不同颜色填充柱子 Python绘制…

IC验证学习笔记(AHB-RAM)08addr、bsize都随机,主要做地址偏移操作

rkv_ahbram_haddr_word_unaligned_virt_seq: 对addr和bsize都随机化操作 ifndef RKV_AHBRAM_HADDR_WORD_UNALIGNED_VIRT_SEQ_SV define RKV_AHBRAM_HADDR_WORD_UNALIGNED_VIRT_SEQ_SVclass rkv_ahbram_haddr_word_unaligned_virt_seq extends rkv_ahbram_base_virtual_sequenc…

深入探讨桥梁建筑中地质工程与仪器仪表应用

近期&#xff0c;随着桥梁建筑行业的不断发展&#xff0c;地质工程与仪器仪表应用成为了热议的话题。在桥梁、建筑、水利工程等领域&#xff0c;渗压计、MCU自动化测量单元、应变计、测缝计、固定测斜仪等各种先进的仪器仪表技术正在广泛应用&#xff0c;为工程施工和监测提供了…

什么是pytest自动化测试框架?如何安装和使用呢?赶快收藏起来

一、pytest是什么&#xff1f; pytest是一款强大的Python测试工具&#xff0c;可以胜任各种类型或级别的软件测试工作。实际上&#xff0c;越来越多的项目在使用pytest。因为pytest会提供更丰富的功能&#xff0c;包括assert重写、第三方插件&#xff0c;以及其他测试工具无法比…

116.【SpringBoot和Vue结合-图书馆管理系统】

前后端分离 (一)、SpringBootVue概述1.基本概述2.实现技术 (二)、Vue3.x搭建 (SpringBootVue)1.搭建Vue基本环境(1).搭建Vue项目框架(2).介绍Vue项目内容 2.搭建SpringBoot基本环境(1).创建SpringBootTest项目(2).初始化项目(3).测试SpringBoot的控制层 3.通过路由跳转访问组件…

Python+selenium自动化元素定位防踩坑

在自动化UI测试过程中常常会在元素定位阶段就踩坑&#xff0c;碰到困扰已久的问题。 以下是个人整理元素定位报错原因和解决方法。 踩坑一&#xff1a;StaleElementReferenceException selenium.common.exceptions.StaleElementReferenceException: Message: stale element re…

JavaScrip 中的 this, bind, call apply 简述

JavaScrip 中的 this, bind, call & apply 简述 this 是一个比较特殊的东西&#xff0c;基本上可以理解成 this 的指向是就近调用的指向&#xff0c;因此 this 在 JS 中也是一个比较令人困惑的知识点。 之前绕过 this 的方法基本上采用 arrow function&#xff0c;因为 a…

35、Adaptive Forms(3)Data Model

文章目录 35、Adaptive Forms&#xff08;3&#xff09;Data Model配置JDBC安装mysql-connector-j.jar在数据库中创建数据创建Data Model 35、Adaptive Forms&#xff08;3&#xff09;Data Model 在使用Mysql数据之前还需要在AEM中创建DataModel映射数据库的数据结构。也需要…

07-架构2023版-centos+docker部署nacos

1、创建nacos的数据库配置 1.1、创建数据库 1.2、创建用户nacos并授权数据库 参考 06 mysql 创建账户部分内容 1.3、执行数据库脚本 导入官方nacos sql语句。如果是历史有历史数据&#xff0c; 从历史数据sql导入 2、创建 bridge 网络并指定 IP 区间 2.1、创建自定义网络…

选择排序:20年前在谭浩强《c语言程序设计上》学习过(43)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 今日主题 什么是选择排序&#xff1f; 用Python写段代码&#xff0c;实现插入排序。 选择排序 选择排序是一种简单的排序算…

Contrastive Learning

https://towardsdatascience.com/understanding-contrastive-learning-d5b19fd96607 The Beginner’s Guide to Contrastive Learning Contrastive Representation Learning | LilLog

Visual Studio 怎样设置断点并调试

1-普通断点 设置普通断点的方法很简单&#xff0c;就是在代码行的左边栏灰色区域点击或者把光标放在某代码行&#xff0c;按下 F9。 2-调试 按F5开始调试&#xff0c;按F11是逐行调试&#xff0c;F10是逐过程调试&#xff0c;shiftF5是停止调试。 3-高级调试 见链接&#x…