MyBatis - 如何创建动态 WHERE 子句

2023-12-15

服务获取一个未知对象,其中包含三个值的列表[列、运算符、值] 例如, 电子邮件 - 就像 - “测试”

基于结果列表来构建我拥有的 WHERE 子句,但我也可以构建这样的条件,如下所示(例如)

WHERE(电子邮件如“测试”AND user_id 5)或(trans_id 500)

有人可以帮我怎么做吗?


我自己也时隔许久重新发现了MyBatis(我曾经也熟悉过iBatis)。 Rolf 的示例看起来可能是 .Net 实现,我可能是错的,但我不认为 Java 表示法现在看起来像那样。 Rolf 关于文字字符串的提示非常有用。

我创建了一个小类来保存列、运算符和值,并将它们传递到 MyBatis 中进行处理。列和运算符是字符串文字,但我将这些值保留为 sql 参数(我想 MyBatis 能够进行任何必要的类型转换)。

public class TestAnswer {
    public static void main(String[] args) {
            ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
            SqlSessionFactory sqlFactory = (SqlSessionFactory) ctx.getBean("sqlSessionFactory");            
            MappedStatement statement = sqlFactory.getConfiguration().getMappedStatement("testAnswer");                        

            ArrayList<Clause> params1 = new ArrayList<Clause>();
            params1.add(new Clause("email","like","test"));
            params1.add(new Clause("user","<>",5));

            ArrayList<Clause> params2 = new ArrayList<Clause>();
            params2.add(new Clause("trans_id","<",100));
            params2.add(new Clause("session_id",">",500));

            HashMap params = new HashMap();
            params.put("params1", params1);
            params.put("params2", params2);

            BoundSql boundSql = statement.getBoundSql(params);
            System.out.println(boundSql.getSql());             
    }

    static class Clause{        
        private String column;
        private String operator;
        private Object value;

        public Clause(String column, String operator, Object value){
            this.column = column;
            this.operator = operator;
            this.value = value;
        }

        public void setColumn(String column) {this.column = column;}
        public void setOperator(String operator) {this.operator = operator;}
        public void setValue(Object value) {this.value = value;}
        public String getColumn() {return column;}
        public String getOperator() {return operator;}
        public Object getValue() {return value;}        
    }    
}

正如您所看到的,我使用 Spring,但我预计类似的东西可能会在 Spring 环境之外工作。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

    <mapper namespace="com.stackoverflow.TestMapper">

    <select id="testAnswer" parameterType="map" resultType="hashmap">
      select *
    FROM somewhere
        <where>
            <foreach item="clause" collection="params1" separator=" AND " open="(" close=")"> 
                ${clause.column} ${clause.operator} #{clause.value} 
            </foreach>            
            OR
            <foreach item="clause" collection="params2" separator=" AND " open="(" close=")"> 
                ${clause.column} ${clause.operator} #{clause.value} 
            </foreach>    
        </where>
    </select>

</mapper>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis - 如何创建动态 WHERE 子句 的相关文章

  • 在 JTable 中移动行

    我使用 MVC 模式 并且有一个如下所示的 JTable List
  • 如何在 JFace 的 TableViewer 中创建复选框?

    我创建了一个包含两列的 tableViewer 我想将其中一列设为复选框 为此 我创建了一个 CheckBoxCellEditor 但我不知道为什么它不起作用 名为 tableName 的列显示其值正常 色谱柱规格如下 String COL
  • ElasticBeanstalk Java,Spring 活动配置文件

    我正在尝试通过 AWS ElasticBeanstalk 启动 spring boot jar 一切正常 配置文件为 默认 有谁知道如何为 java ElasticBeanstalk 应用程序 不是 tomcat 设置活动配置文件 spri
  • Java程序中的数组奇怪的行为[重复]

    这个问题在这里已经有答案了 我遇到了这个 Java 程序及其以意想不到的方式运行 以下程序计算 int 数组中元素对之间的差异 import java util public class SetTest public static void
  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • 如何测试 JUnit 测试的 Comparator?

    我需要测试 Compare 方法 但我对如何测试感到困惑 我可以看看该怎么做吗 public class MemberComparator implements Comparator
  • CXF Swagger2功能添加安全定义

    我想使用 org apache cxf jaxrs swagger Swagger2Feature 将安全定义添加到我的其余服务中 但是我看不到任何相关方法或任何有关如何执行此操作的资源 下面是我想使用 swagger2feature 生成
  • Convert.FromBase64String 方法的 Java 等效项

    Java 中是否有相当于Convert FromBase64String http msdn microsoft com en us library system convert frombase64string aspx which 将指
  • 如何为 Gson 编写自定义 JSON 反序列化器?

    我有一个 Java 类 用户 public class User int id String name Timestamp updateDate 我收到一个包含来自 Web 服务的用户对象的 JSON 列表 id 1 name Jonas
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • Springs 元素“beans”不能具有字符 [children],因为该类型的内容类型是仅元素

    我在 stackoverflow 中搜索了一些页面来解决这个问题 确实遵循了一些正确的答案 但不起作用 我是春天的新人 对不起 这是我的调度程序 servlet
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • java迭代器内部是如何工作的? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个员工列表 List

随机推荐

  • instanceof 抛出不兼容的类型

    我最近在以下代码片段中遇到了一个奇怪的编译错误 class A class B extends A class Example class Demo public static void main String args B b new B
  • android gridview 行分隔符/分隔符

    有没有办法在网格视图中的行之间显示 水平 分隔线 我尝试在每个网格项目下方放置一个小分隔符图像 但这不是解决方案 因为当一行未完全填充项目时 它不会跨越整行 有没有办法在每一行之间添加图像 我只能找到改变行间距的方法 如果您使用网格项目的自
  • 格式指定类型“unsigned Short”,但参数类型为“int”

    我有一个扫描字符串的方法 将任何新行转换为 br 对于 HTML 有问题的行是 NSCharacterSet newLineCharacters NSCharacterSet characterSetWithCharactersInStri
  • 如果是负数则删除行

    如果我的 data frame 看起来像 A B C 1 10 James Math 2 1 Tony Science 3 5 Kevin Math 4 11 Chris Math 5 13 Min English 我想删除行 如果A有一个
  • 如何自动化使用 Web 服务的任务

    我有一个winform应用程序需要消耗一个网络服务 Web 服务检查数据库中是否有任何更改 如果数据库中有任何更改 则应通知 winform 应用程序并相应地执行一些任务 我怎么做 我想在我的 winform 应用程序中使用计时器 然后每隔
  • 将 HTML 字符串转换为图像

    我有一个保存 HTML 标记的字符串变量 该 HTML 标记基本上代表了电子邮件内容 现在我想根据该字符串内容创建一个图像 该图像实际上包含 HTML 标记 我不想通过将此内容写入其中来创建 HTML 文件 我只想使用这个字符串创建一个图像
  • CHtmlView Navigate2 和 ExecWB 执行

    这是链接到我之前的问题 我已经成功地从CHtmlView对于我的应用程序生成的报告的新型视图 但我在新视图中发现了一些问题 class CMyHtmlView public CHtmlView protected create from s
  • async/await 总是返回承诺

    我正在尝试异步 等待功能 我有这样的代码模仿请求 const getJSON async gt const request gt new Promise resolve reject gt setTimeout gt resolve foo
  • 如果派生类继承基类的私有成员,那么为什么不继承构造函数呢?

    我想澄清我对 C 中这个基本 OOPS 概念的理解 在大多数互联网网站上 我读到派生类inherits基类的私有成员 但它无法访问那些成员 派生类可以访问 public protected internal 和 基类的受保护内部成员 即使派
  • 使用 AlertDialog.Builder 时防止显示 StatusBar

    In the XML of my MainActivity 我已经对其进行了编程 以便it uses一个主题与NoActionBar因此没有显示操作栏 然而 每当我想显示一个对话框时 我都会调用我的一个DialogFragments使用一个
  • 如何比较 SKSpriteNode 纹理

    我正在使用 Sprite Kit 制作游戏 当发生碰撞时 我想检索与我的射弹碰撞的 SKSpriteNode 的图像 以根据怪物的图像分配不同的点值 我认为比较 SKSpriteNode 的纹理属性是可行的 我尝试过以下代码 但我的 if
  • Laravel 5 - 从用户的所有设备中注销用户

    一个用户已登录 并且他也已经在 3 台不同的计算机上登录 现在用户更改了密码 我想做点什么让他从所有设备上注销 默认情况下 如果我们在一台设备上更改密码 其他设备上不会发生任何情况 首先想到的是在中间件 每个请求 中检查密码 这不好并且会显
  • Android 日历特定事件删除

    我创建了一个应用程序 可以轻松地将我想要的值放入设备的日历中 但是当我想以编程方式从日历中删除它时 我找不到方法 我在网上搜索过 主要是其他 stackoverflow 问题 以找到答案 此处链接 删除日历条目 日历中的事件未删除 删除特定
  • 透明前景

    我想添加一个半透明的均匀层作为前景div元素 最好的方法是什么 你可以使用这个CSS div parent position relative this div is a descendent of the div above div ch
  • Android:带背景的透明彩色ListView

    I have a doubt I have a listview and below it there is a background with a image I would like to have the lists with a t
  • 执行长进程时,Windows 窗体中的动画 GIF

    我用 C 开发了一个简单的 Windows 应用程序 MDI 它将数据从 SQL 导出到 Excel 我正在使用 ClosedXML 成功实现这一目标 当该过程执行时 我想显示一个包含动画 GIF 图像的图片框 我是初学者 不知道如何实现这
  • 如何在Android中的mapView上使用kml文件

    我想知道如何以编程方式将已创建的 kml 文件加载到地图视图中 kml 文件存储在 SD 卡中 我已经设置了一个mapActivity 我是否只是 SAX 解析 kml 文件并使用绘制方法来创建边界 这是存储在手机上的 kml 文件的片段
  • 使用 pd.json_normalize 展平字典

    我目前正在努力压平这个字典文件 并且已经遇到了一些障碍 我正在尝试使用json normalize来扁平化这些数据 如果我用单个实例进行测试 它可以工作 但如果我想展平所有数据 它将返回一个错误 说明key error 0 我不知道如何解决
  • 如何在不使用 tf.assign 的情况下为 TensorFlow 中的 tf.Variable 赋值

    我有一个包含 4x4 单位矩阵的变量 我希望为这个矩阵分配一些值 这些值是由模型学习的 当我使用tf assign 我收到一条错误消息 指出跨步切片没有渐变 我的问题是如何在不使用的情况下做到这一点tf assign 这是所需行为的示例代码
  • MyBatis - 如何创建动态 WHERE 子句

    服务获取一个未知对象 其中包含三个值的列表 列 运算符 值 例如 电子邮件 就像 测试 基于结果列表来构建我拥有的 WHERE 子句 但我也可以构建这样的条件 如下所示 例如 WHERE 电子邮件如 测试 AND user id 5 或 t