orm框架sequelize的where条件接受动态参数传入

2023-05-16

      在nodejs项目中,接口会接收从前台传来的查询参数,接口里面根据请求参数动态查询数据库,例如分页参数等等;sequelize官方文档中并没有提及如何做,不过可以利用sequelize的特性去巧妙实现。下面介绍两种方式:

      先来看第一种方式:由于sequelize的where查询条件本身就是一个对象object,所以我们可以利用这种特性,提前根据请求参数以及各种条件判断来构造这个对象,构造完以后,放进对应的查询位置就好,代码如下:  

      // 这是一个在前台展示用户列表的接口

static async list(req, resp) {
    // 前台可能会传来nickname、account来模糊查询,以及分页参数
    const {page, pageSize, nickname, account} = req.query;
    // where条件接受一个对象传入,先定义一个对象,用{}符号
    let criteria = {};
    const start = (page - 1) * pageSize;
    let total = 0;
    let list = null;
    // 检查前台传来的参数是否为空,从而构造各种查询条件     if (nickname) {
        criteria['nickname'] = nickname;
        if (account) {
           // 这里用的就是纯粹的=符号,代表精确查找,下面例举了like符号,更多符号自己探索
           criteria['account'] = account;
        }
     } else if (account) {
          // 这里后面赋值的是like操作符,代表模糊查询,后面account用``反引号字符串替换模板将account代入进去
          criteria['account'] = {$like: `%${account}%`};
     }    await UserModel.findAndCountAll({
        where: criteria, // 将前面构造的对象传入
        offset: start,
        limit: Number(pageSize)}).then( // 由于前端使用了element-ui,传过来的pageSize是string型,要转一下
            result => {
        total = result.count;
        list = result.rows;

    });
    resp.json(new result(200, {total, list}));
}

      如果你都是根据前台传来的请求参数进行精确查找的话,那么上面的代码完全可以写成下面这种形式:

这是因为where: {nickname , account }这句代码,还记得我们说过where参数可以是一个对象吗,在sequelize中那句代码就代表where: {nickname: nickname , account: account },传进的参数即是参数名,本身也是参数值。如下所示:

static async list(req, resp) {
    const {page, pageSize, nickname, account} = req.query;
    let criteria = {};
    const start = (page - 1) * pageSize;
    let total = 0;
    let list = null;
    await UserModel.findAndCountAll({
        where: {nickname , account },
        offset: start,
        limit: Number(pageSize)}).then(
            result => {
        total = result.count;
        list = result.rows;

    });
    resp.json(new result(200, {total, list}));
}

      第二种方式如下所示:它将判断条件都放到了where中,用的是三目运算符,假如条件为真,中括号里面像是在拼装原生sql语句,并且还用到了?号占位符,两个参数外面用了一个sequelize.and包裹,这个符号等同于$and,当然如果你需要其他查询方式,可以换成其他符号,例如or等等。我的项目使用了TypeScript,在我的项目中下面这种方式代码下面一直冒红

await UserModel.findAndCountAll({
    where: sequelize.and(
        nickname ? ['nickname = ?', nickname] : null,
        account ? ['account = ?', account] : null
    ),
    offset: start,
    limit: Number(pageSize)}).then(
        result => {
    total = result.count;
    list = result.rows;

});

    如果上面代码不冒红能正常编译的话,where条件的sql语句打印出来为 where (nickname='xxxx' and account='xxxxx' ),假如account为空null的话,打印出来的sql语句为where (nickname='xxxx' and 1=1 );假如两个参数都为空,那就是where (1=1 and 1=1 );奇妙吧,对你的查询结果丝毫没有影响,因为你本来就是想要查询全部结果。总之使用了typescript的话,这种方式用不了,原始的javascript可以试一下

     随后我就改良了一下,将中括号里面的语句改成反引号字符串替换模板形式,where关键词又冒红

await UserModel.findAndCountAll({
    where: sequelize.and(
        nickname ? `nickname = ${nickname}` : null,
        account ? `account = ${account}` : null),
    offset: start,
    limit: Number(pageSize)}).then(
        result => {
    total = result.count;
    list = result.rows;

});

    因为sequelize和typescript语法经常冲突,所以我就想先运行试一下,运行时,调用接口,报下面的错误:Error: Support for `{where: 'raw query'}` has been removed. 

    我用的sequelize版本为4.41.2,可能raw 查询不支持了,或者默认关闭了,我看到有个参数为raw,可以将它设置true,我没试。

    参考链接:https://github.com/sequelize/sequelize/issues/1955

https://stackoverflow.com/questions/42236837/how-to-perform-a-search-with-conditional-where-parameters-using-sequelize

https://stackoverflow.com/questions/26106165/sequelize-dynamic-query-params

https://stackoverflow.com/questions/36466395/sequelize-optional-where-clause-parameters

                     

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

orm框架sequelize的where条件接受动态参数传入 的相关文章

  • 只读模式下不允许写操作(FlushMode.MANUAL)

    我对Spring真的很陌生 我正在使用 JSF Hibernate Spring 开发一个简单的 JEE 应用程序 我在尝试更新 DAO 上的值时遇到一些问题 我确信问题与 Spring 配置 xml 文件有关 但我无法找出是什么 这是我的
  • 您使用的 ORM 框架的最佳功能是什么[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • Hibernate 4 字节码增强不适用于脏检查优化

    我正在使用 Hibernate 4 3 6 并且我使用了最新的Maven 字节码增强 http vladmihalcea com hibernate 4 bytecode enhancement 使所有实体提高自我肮脏意识 我添加了mave
  • 如何在 Hibernate 拦截器中获取 Hibernate 会话?

    如何在 Hibernate 拦截器中获取 Hibernate 会话 我正在尝试使用 Hibernate 透明地强制按组织 ID 进行数据访问 我设置了一个全局过滤器来按组织 ID 过滤所有查询 现在 我需要在保存 更新之前使用实体拦截器在所
  • Hibernate、MySQL 视图和 hibernate.hbm2ddl.auto = 验证

    我可以在 Hibernate 中使用 MySQL 视图 将它们视为表 即 该实体与为表创建的实体没有什么不同 但是 当 Hibernate 设置为验证模型时 我的应用程序将不会部署 因为它找不到视图 因为它假设它是一个表 是否可以在启用部署
  • 如何在 Hibernate 中使用 Oracle 查询提示

    我试图在 Hibernate 中使用 Oracle 提示来调用强制索引 但在 Hibernate 3 6 10 Final 中没有找到任何合适的 API 我以某种方式尝试了 Hibernate 标准中的预测 proList add Proj
  • 将 Django +1.10 与 MongoDB 连接

    在过去的几个月里 有人为 MongoDB 更换了 Django 1 10 中的默认数据库引擎吗 我在谷歌上得到的所有信息都是六四年前的 最常见的结果包括mongodb 引擎这需要Django nonrel 来自 Django 1 5 的一个
  • 具有 LINQ 支持的最完整的 ORM?

    我正在寻找一个提供完整或接近完整的 LINQ 支持的 ORM LINQ 到 SQL 支持 LINQ 内部的所有内容 Contains Math Log 等 在不创建新数据上下文的情况下无法预先加载关系属性 ADO NET 实体框架 糟糕的
  • 学说“没有命名的协会”

    将我添加到无法找出其学说映射出了什么问题的人列表中 我正在模拟国际象棋Game与一对多Halfmoves 有任何想法吗 DDL create table game game id int primary key create table h
  • 如何在此查询中获取以 KM 为单位的距离

    salons Salon select salons gt selectRaw 6371 acos cos radians cos radians lat cos radians lng radians sin radians sin ra
  • Hibernate 中的 UserType 加入

    在这种情况下 是否有可能让 hibernate 为某些 正确 值做 正确的事情 from ClassA a ClassB b where a prop b prop 问题是 prop 是一个 UserType 在连接表中具有不同的表示形式
  • Hibernate更新查询问题

    对于此更新查询 update TestDB dbo MyEmp set empname where empid 我在 DAO 课上写的 MyEmployee myEmployee new MyEmployee MyEmployee myEm
  • Laravel Eloquent with()-> 返回 null

    我正在尝试使用 Eloquent 来获取具有以下功能的特定产品 brand id映射到a的列brands表 该brand数组返回空 这里有什么明显需要改变的地方吗 product Product with images gt with br
  • Doctrine ORM 的表命名约定

    使用 Doctrine ORM 时是否有命名表的约定 我喜欢用复数来命名表格 但如果有约定 我想遵守它 因此 表 users 将与使用 fk 作为单数 user id 的表相关 是否有最佳实践 使用单数或复数表名称 如果是后者 这如何应用于
  • orm和pdo的区别

    我对 ORM 和 PDO 之间的区别有点困惑 PDO是一种ORM吗 根据我的理解 ORM 基本上是一种数据映射 PDO 还提供了数据库数据的抽象 PDO 和 ORM 是两个完全不同的东西 PDO 是数据库访问抽象层的具体实现 它使您能够使用
  • 按每组的最近日期获取第一个元素

    我在 django 中有以下模型 Business ID Business Name Business Revenue Date 这是示例数据 Business ID Business Name Business Revenue Date
  • 我应该在哪里编写结合两个模型的控制器逻辑

    想象一下我有 PostController 和 CommentController 当然我有 Post 模型和 Comment 模型 所以现在我收到请求对Post和Comment模型进行一些修改 也许这个修改逻辑不仅结合了两个模型 而且结合
  • 如何在 QueryDSL 中选择文字

    我目前正在开发一个使用 queryDSL 和 hibernate 的项目 其中它需要一个选择文字 按照发布的示例here https stackoverflow com questions 18691317 querydsl how to
  • 没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。 -- Netbeans、Postgresql 8.4 和 Glassfish

    我正在尝试使用 EclipseLink 在 Glassfish 中使用 JPA 编辑 Postgresql 中的表 当我插入一个实体时 它运行良好 但是 当我尝试编辑或删除同一实体时 它失败并出现以下错误 任何想法 Caused by Ex

随机推荐

  • windows安装elasticsearch6.2.2报错误:找不到或无法加载主类 org.elasticsearch.tools.launchers.JavaVersionChecker

    项目场景 xff1a windows安装elasticsearch6 2 2 问题描述 windows安装elasticsearch6 2 2 xff0c bin目录下运行elasticsearch命令 xff0c 提示 xff1a 错误
  • ArrayList排序返回值问题

    记录 xff0c ArrayList排序不好使 Comparator返回值在1 7里必须是一对相反数 xff0c 如1和 1 xff0c 不能是1和0 因为1 7的排序算法采用timsort http baike baidu com lin
  • Qt5.14.2 编程应用

    目录 简介 什么是Qt Qt可以做什么 安装 ubuntu安装Qt5 14 2 1 xff0c 下载地址 xff1a Index of archive qt 5 14 5 14 2 2 xff0c 安装 示例与运行 查看官方示例源代码 创建
  • 解读AFNetworking4.0请求原理

    简介 AFNetworking4 0 是对NSURLSession的封装 xff0c 之前版本有NSURLConnection的封装 xff0c 现在已经被废弃 简单聊一下 xff0c 为啥AF要弃用之前的NSURLConnection封装
  • SSM框架中的数据库连接问题

    SSM框架搭建好以后 xff0c 由于log4j的日志输出有限 xff0c 经常遇见事务无法执行但是却很难定位的情况 DEBUG以后才发现是Mapper文件中的语法错误导致 所以 xff0c 在异常转化的拦截器类 xff08 Busines
  • 一文详解Unexpected character (‘“‘ (code 34)): was expecting comma to separate Object entries的问题

    文章目录 1 复现问题2 分析问题3 解决问题4 重要补充4 1 knife4j的详细教程 1 复现问题 今天在使用knife4j请求后端接口时 xff0c 首次请求能够正常访问 只是修改个参数值 xff0c 就报出如下错误信息 xff1a
  • 全网超详细的VMware虚拟机安装Kali Linux系统以及首次启动Kali Linux系统的注意事项

    文章目录 1 简述Kali Linux2 下载Kali Linux的镜像文件3 安装Kali Linux4 首次启动Kali Linux5 其他方法安装Kali Linux 1 简述Kali Linux 引入知乎上的一句话 xff0c 如下
  • Error attempting to get column ‘xxx‘ from result set. Cause: java.sql.SQLDataException错误的解决方法

    文章目录 1 复现错误2 分析错误3 解决错误4 文末总结 1 复现错误 今天写好导入hive表的详情列表的接口 xff0c 如下代码所示 xff1a span class token comment hive表导入的回调接口 64 aut
  • 文件传输协议FTP、SFTP、SCP

    今天在了解Ansible的时候看到了Ansible是基于SFTP协议进行文件传输的 xff0c 就想了解下FTP协议与SFTP协议的区别 xff0c 因为总结了这篇文章 应用层 xff1a HTTP xff08 Hypertext Tran
  • SSH配置免密登录 详解(踩坑无数总结)

    之前在使用Ansible部署工具的时候 xff0c 需要先配置好SSH免密登录 xff0c 在配置时踩了很多的坑 xff08 按照很多文章的步骤并不能完全配置好免密登录 xff09 xff0c 因此在踩完所有的坑之后 xff0c 总结出来这
  • CentOS7.6升级内核到5.11及build RPM包

    目录 源码编译方式升级内核 安装依赖包 升级GCC 编译安装kernel5 11 构建RPM包 安装RPM包 源码编译方式升级内核 在编译高版本内核之前 xff0c 构建编译环境以及依赖包安装是肯定的 xff1b 但是 xff0c Cent
  • 内存对齐规则--图文详解

    在之前的C语言结构体的学习中 xff0c 遇到了内存对齐的问题 xff0c 之后在C 43 43 的类的学习中 xff0c 再次遇到了内存对齐问题 xff0c 所以我觉得有必要总结一下这个知识点 内存对齐规则 1 xff09 第一个成员在与
  • #define定义宏函数 的正确使用

    如何使用宏来定义一个自定义函数呢 xff1f 首先我们来看下面这段代码 define SQUARE x x x int main int a 61 5 printf 34 SQUARE a d n 34 SQUARE a 这个值为25 pr
  • C语言运算符优先级列表(超详细)

    本篇文章是对C语言中运算符的优先级进行了详细的分析介绍 xff0c 需要的朋友参考下 C语言运算符优先级 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 数组下标 数组名 常量表达式 左到右 圆括号 表达式 xff09 函数名 形
  • 直接插入排序讲解及代码实现

    基本思想 每一步将一个待排序的元素 xff0c 按其排序码的大小 xff0c 插入到前面已经排好序的一组元素的合适位置上去 xff0c 直到元素全部插完为止 当插入第i i gt 61 1 个元素时 xff0c 前面的array 0 arr
  • 虚拟地址空间 及 页表 详解

    虚拟地址空间 进程地址空间由进程可寻址的虚拟内存组成 xff0c 内核允许进程使用这种虚拟内存的地址 每个进程都有一个 32位或64位 的平坦地址空间 xff0c 空间的大小取决于体系结构 xff08 平坦指的是地址空间范围是一个独立的连续
  • vector 模拟实现

    define CRT SECURE NO WARNINGS 1 include lt iostream gt include lt algorithm gt include lt assert h gt include lt Windows
  • C语言中的字节对齐

    一 什么是字节对齐 一个基本类型的变量在内存中占用n个字节 则该变量的起始地址必须能够被n整除 即 存放起始地址 n 61 0 那么 就成该变量是字节对齐的 对于结构体 联合体而言 这个n取其所有基本类型的成员中占用空间字节数最大的那个 内
  • Gson转换Date类型出错处理(com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate)

    用Gson做对象和Json字符串相互转换很方便 xff0c 但要把包含java util Date类型属性的对象转换成Json字符串 xff0c 如下面的代码 xff1a Gson gson 61 new Gson String p 61
  • orm框架sequelize的where条件接受动态参数传入

    在nodejs项目中 xff0c 接口会接收从前台传来的查询参数 xff0c 接口里面根据请求参数动态查询数据库 xff0c 例如分页参数等等 xff1b sequelize官方文档中并没有提及如何做 xff0c 不过可以利用sequeli