首页 > 其他分享 >如何用typeORM制作复杂的嵌套WHERE条件?

如何用typeORM制作复杂的嵌套WHERE条件?

时间:2024-03-22 19:11:18浏览次数:23  
标签:嵌套 myId date Table WHERE id typeORM

如何用typeORM制作复杂的嵌套WHERE条件?

2023-02-18 12:00:38 other 阅读:1320 本文介绍了如何用typeORM制作复杂的嵌套WHERE条件?的处理方法,对大家解决问题具有一定的参考价值

问题描述

我有多个嵌套的WHERE条件,希望使用TypeORM生成它们时不会有太多代码重复。

SQL WHERE条件应如下所示:

 WHERE "Table"."id" = $1
AND
"Table"."notAvailable" IS NULL
AND
(
  "Table"."date" > $2
  OR
  (
    "Table"."date" = $2
    AND
    "Table"."myId" > $3
  )
)
AND
(
  "Table"."created" = $2
  OR
  "Table"."updated" = $4
)
AND
(
  "Table"."text" ilike '%search%'
  OR
  "Table"."name" ilike '%search%'
)

但使用FindConditions似乎不可能使它们嵌套,因此我必须在FindConditions数组中使用AND的所有可能组合。并且无法将其拆分为.where().andWhere(),原因是andWhere无法使用对象文本。

是否有其他可能在不使用原始SQL的情况下使用typeORM实现此查询?

推荐答案

我认为您混合了从TypeORM中检索实体的两种方法,find从存储库和查询构建器。FindConditions用于查找函数。andWhere函数由查询构建器使用。在生成更复杂的查询时,使用查询生成器通常更好/更容易。


Query builder

使用查询构建时,您可以更自由地确保查询符合您的要求。您可以在其中随意添加任何SQL:

const desiredEntity = await connection
  .getRepository(User)
  .createQueryBuilder("user")
  .where("user.id = :id", { id: 1 })
  .andWhere("user.date > :date OR (user.date = :date AND user.myId = :myId)",
    { 
      date: specificCreatedAtDate,
      myId: mysteryId,
    })
  .getOne();
请注意,根据您使用的数据库,您在这里使用的实际SQL需要是兼容的。随之而来的也可能是使用这种方法的回落。您将把您的项目绑定到特定的数据库。如果您使用关系,请务必阅读有关aliases可以设置的表的信息,这将非常方便。

 


Repository

您已经看到,这不是很舒服。这是因为find函数或更具体地说findOptions使用对象来构建WHERE子句。这使得实现适当的接口来同时实现嵌套的ANDOR子句变得更加困难。在那里(我假设)他们选择了拆分ANDOR子句。这使得接口更具声明性,并意味着您必须将OR子句放在顶部:

const desiredEntity = await repository.find({
  where: [{
    id: id,
    notAvailable: Not(IsNull()),
    date: MoreThan(date)
  },{
    id: id,
    notAvailable: Not(IsNull()),
    date: date
    myId: myId
  }]
})

我无法想象查看所需查询的大小时,此代码会有很高的性能。

或者,您可以使用RawFind帮助器。这将要求您按字段重写子句,因为您一次只能访问一个别名。您可以猜测列名或别名,但这将是非常糟糕的做法,而且非常不稳定,因为您不能直接轻松地控制它。

标签:嵌套,myId,date,Table,WHERE,id,typeORM
From: https://www.cnblogs.com/sexintercourse/p/18090277

相关文章

  • 减少循环嵌套,提升代码运行速度!你不知道的3个实用Python函数(转)
    原文地址(https://zhuanlan.zhihu.com/p/114787201)作为21世纪最流行的语言之一,Python有很多有趣的功能值得深入探索和研究。今天将讨论其中的三个你可能没听说过的函数,将从理论和实际应用两方面为你详细讲解。我之所以要讨论这些函数,主要是因为它们可以帮助你避免陷入编写循环中......
  • DAX:GROUPBY 嵌套聚合
    GROUPBY函数的作用是根据输入的表进行数据聚合,输入的表可以是表表达式,也就是说,GRUOPBY的参数可以是一个动态查询返回的表,也就是说GROUPBY函数主要用于嵌套聚合的情况。GROUPBY(<table>[,<groupBy_columnName>[,<groupBy_columnName>[,…]]][,<name>,<expression>[,<......
  • react router v6实现嵌套路由
    做一个简单的笔记有两种方式可以实现使用标签BrowserRouter来实现使用APIcreateBrowserRouter来实现注意:createBrowserRouter是6.4版本才引入的这是官方文档注意,这两个是不兼容的使用标签BrowserRouter来实现创建路由//src/router/index.tsxconstrouter=[......
  • flutter 嵌套web网页
    添加依赖flutter_inappwebview:^6.0.0#嵌套网页代码classPictureWebUrlextendsStatefulWidget{finalStringweburl;PictureWebUrl({Key?key,requiredthis.weburl}):super(key:key);@overrideState<PictureWebUrl>createState()=>_PictureW......
  • SQL 查询优化之 WHERE 和 LIMIT 使用索引详解
    奇怪的慢sql我们先来看2条sql第一条:第二条:表的索引及数据总情况: 索引:acct_id,create_time分别是单列索引,数据库总数据为500w。通过acct_id过滤出来的结果集在1w条左右。 查询结果:第一条要5.018s,第二条0.016s为什么会是这样的结果呢?第一,acct_id和create_time都有索引,不......
  • 路由嵌套
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><scriptsrc=......
  • [GFCTF 2021]where_is_shell :)shell use new posture
    [GFCTF2021]where_is_shellshell的特殊姿势看上去很简单的栈溢出,但是问题在于找不到能用的/bin/sh或者sh这里出现了一个shell的新姿势:可以利用system($0)获得shell权限,$0在机器码中为\x24\x30在tips函数中正好有\x24\x30可以用来构造,所以需要取出0x400541关于ida打......
  • 从后端获取的数据,是多层嵌套的,该如何传递给各个tab和子组件,如表单和表格?
    当后端返回的数据是多层嵌套结构时,传递给各个Tab和子组件(如表单和表格)可以按照以下步骤进行:状态管理:使用React的状态管理库如Redux、MobX或React的ContextAPI来集中存储从后端获取的多层嵌套数据。这样可以确保所有子组件都可以访问到这些数据。//使用Redux示例import{c......
  • OpenMP - 嵌套循环"collapse"
    collapse子句用于将多个嵌套的循环折叠成一个单独的循环。这个特性通常用于在嵌套循环上并行化以提高性能。参数n指定了折叠的层数。#include<iostream>#include<omp.h>usingnamespacestd;intmain(intargc,char*argv[]){inta[6][6];#pragmaompparallel......
  • Mysql 100个表嵌套查询 存储过程
    背景1. 业务销售订单会随机落在1~100表中,查询一个订单时需要1到100表依次去查询,增加手工重复操作和浪费时间。2.查询未解冻数据时,需要过滤部分解冻的数据,此时需要用到嵌套查询。 一、根据订单号,循环1~100个表,查询出订单数据CREATEDEFINER=`{数据库连接账号}`@`%`......