getRawMany()和getMany()的区别

解决SELECT list is not in GROUP BY clause and contains nonaggregated column ‘testdata.logs.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

前言:

nest/typeorm报错

SELECT list is not in GROUP BY clause and contains nonaggregated column ‘testdata.logs.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

1.返回结果区别

getMany()getRawMany() 返回的结果有一些显著的区别,根据你的具体需求,你可以选择使用其中之一。

1.getMany() 返回的结果:

  1. 返回结果为 TypeORM 实体对象的集合,即经过实体映射(entity mapping)的结果。
  2. 返回的是符合查询条件的实体对象数组,每个元素都是一个经过 TypeORM 映射的实体对象。这意味着你可以直接从结果中访问实体对象的属性,并对其进行操作。
  3. 适用于一般的实体查询及与数据库表对应的操作,例如数据的读取、更新、删除等。

2.getRawMany() 返回的结果:

  1. 返回结果为原始的数据库查询结果,即未经过实体映射的结果。
  2. 返回的是一组普通的 JavaScript 对象数组,每个元素代表了数据库查询结果中的一行记录。这意味着你需要手动处理和操作这些原始的查询结果。
  3. 适用于需要执行原生的 SQL 查询、需要对原始数据进行聚合、统计、复杂数据操作等情况。

总的来说,getMany() 适用于从数据库中获取类型化的实体对象集合进行操作,而 getRawMany() 适用于执行原生的 SQL 查询及对原始数据进行操作

2.看个例子:

在TypeORM中,getRawMany()getMany() 是两种执行查询并返回结果的方法,它们之间有一些关键的区别。

  1. getRawMany() getRawMany() 方法返回的是原始的数据库查询结果,这意味着它返回的是一组普通的 JavaScript 对象,而不是经过实体映射(entity mapping)的 TypeORM 实体对象。这对于复杂的查询或者需要直接操作原始数据的情况非常有用。当你执行原生查询,或者需要聚合函数的结果时,这个方法特别有用。
const result = await entityManager.createQueryBuilder().select("user.name", "userName").addSelect("COUNT(*)", "postCount").from(User, "user").leftJoin("user.posts", "post").groupBy("user.id").getRawMany();
  1. getMany() getMany() 方法返回的是经过实体映射(entity mapping)的 TypeORM 实体对象的数组。这意味着返回的结果会被 TypeORM 映射为你定义的实体类的实例。这对于常规的数据库操作和数据持久化非常有用。
const users = await userRepository.find();

总的来说,getRawMany() 适用于需要直接操作原始数据或者复杂查询的情况,而 getMany() 适用于常规的数据库操作和通过实体对象进行处理的情况。

当使用 TypeORM 进行查询时,你可以根据具体的需求来选择使用 getMany()getRawMany()

1.适合使用 getMany() 的情况:

  1. 常规查询:当你希望查询并返回和 TypeORM 实体对象对应的结果时,使用 getMany() 是最直接的方法。比如:

    const users = await userRepository.find();
    
  2. 实体关联查询:当你希望获取实体及其关联的其他实体对象时,如一对多关系中的子实体,或使用 LEFT JOININNER JOIN 查询时,也可以使用 getMany() 来获取实体及其关联的多个实体对象。

    const usersWithPosts = userRepository.find({ relations: ['posts'] });
    

2.适合使用 getRawMany() 的情况:

  1. 原生查询:当你需要执行原生的 SQL 查询,或者使用数据库特定的函数或特性时,通常会选择使用 getRawMany() 来获取原始的查询结果。

    const result = await entityManager.createQueryBuilder().select("user.name", "userName").addSelect("COUNT(*)", "postCount").from(User, "user").leftJoin("user.posts", "post").groupBy("user.id").getRawMany();
    
  2. 对于聚合函数的使用:当你需要使用聚合函数(如 COUNT、SUM 等)进行查询时,getRawMany() 可以直接返回原始的聚合结果。

    const postCounts = await postRepository.createQueryBuilder().select("COUNT(*)", "postCount").getRawMany();
    

总的来说,当你需要返回实体对象的集合时,使用 getMany();而当需要执行原生的 SQL 查询,或者对原始数据进行操作时,使用 getRawMany()

3.我犯的错

  • 一号查询

     async getLogsList(): Promise<any> {return this.logRepository.createQueryBuilder('logs').select('logs.response').addSelect('COUNT(logs.response)', 'count').leftJoinAndSelect('logs.user', 'user').where('userId = :id', { id: 2 }).groupBy('logs.response').getRawMany(); // 如果你使用原始查询而不是实体的话,使用getRawMany()}
    
  • 二号查询

      async getLogsList(): Promise<any> {return (this.logRepository.createQueryBuilder('logs').select('logs.response').addSelect('COUNT(logs.response)', 'count').leftJoinAndSelect('logs.user', 'user').where('userId = :id', { id: 2 }).groupBy('logs.response').getMany());}
    

二号查询虽然你使用了getMany(),但是查询语句中使用了聚合函数COUNT,这是导致使用 getMany() 出现问题的原因。

getMany() 用于获取实体对象的集合,而 COUNT 是一个聚合函数,它会计算匹配条件的行数,并返回一个单独的结果。在TypeORM中,getMany() 适用于简单的实体查询,但并不适用于需要使用聚合函数的情况。

在二号示例中,,addSelect('COUNT(logs.response)', 'count') 使用了聚合函数来统计logs表中response字段的数量。因此,使用 getMany() 无法正确地返回聚合后的结果。相反,你应该使用 getRawMany() 来获取原始的查询结果,而不是实体对象的集合。

所以,应该使用 .getRawMany() 来获取聚合函数的结果,就像下面这样:

async getLogsList(): Promise<any> {return (this.logRepository.createQueryBuilder('logs').select('logs.response').addSelect('COUNT(logs.response)', 'count').leftJoinAndSelect('logs.user', 'user').where('userId=:id', { id: 2 }).groupBy('logs.response').getRawMany());
}

通过使用 .getRawMany(),能够正确地获取到聚合函数的结果,而不是尝试将聚合的结果映射为实体对象的集合。

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

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

相关文章

Redis中的复制功能(三)

复制 服务器运行ID 除了复制偏移量和复制积压缓冲区之外&#xff0c;实现部分重同步还需要用到服务器运行ID(run ID): 1.每隔Redis服务器&#xff0c;不论主服务器还是从服务&#xff0c;都会有自己的运行ID2.运行ID在服务器启动时自动生成&#xff0c;由40个随机的十六进制…

迈向数字化医疗:互联网医院APP开发中的设计思路与技术要点

在开发互联网医院APP时&#xff0c;需要综合考虑设计思路和技术要点&#xff0c;确保用户体验和医疗服务质量的提升。接下来&#xff0c;小编将从设计思路和技术要点两个方面进行讲解。 一、设计思路 用户导向&#xff1a;在设计互联网医院APP时&#xff0c;需要将用户体验放在…

RocketMQ 消费者源码解读:消费过程、负载原理、顺序消费原理

B站学习地址 上一遍学习了三种常见队列的消费原理&#xff0c;本次我们来从源码的角度来证明上篇中的理论。 1、准备 RocketMQ 版本 <!-- RocketMQ --> <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-s…

vs2022断点找bug出错(打上100个断点)

初步分析&#xff1a;故障出自-具体功能模块 进一步分析&#xff1a;故障出自-该功能代码流程 进一步分析&#xff1a;从该功能起点-终点&#xff0c;一路打100个断点

ICLR 2024 | 鸡生蛋蛋生鸡?再论生成数据能否帮助模型训练

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 发布在https://it.weoknow.com 更多资源欢迎关注 随着生成模型&#xff08;如 ChatGPT、扩散模型&#xff09;飞速发展&#x…

Nomad Web更新没有最快只有更快

大家好&#xff0c;才是真的好。 很长时间没介绍运行在浏览器中的Notes客户端即Nomad Web更新情况。 不用安装&#xff0c;直接使用&#xff0c;还可以完美地兼容适应各种操作系统&#xff0c;Nomad Web一定是Notes/Domino产品现在和将来重点发展的用户访问模式。 不过&…

【CKA模拟题】一文教你用StorageClass轻松创建PV

题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetesYour task involves setting up storage components in a Kubernetes cluster. Follow these steps: Step 1: Create a Storage Class…

蓝桥杯_阅读魔法书(字符串匹配)

原题连接 #include <iostream> #include <string> #include <algorithm> #include <vector> using namespace std;string s; vector<string> vs;int n;int main() {cin>>s>>n;while(n--){string t; cin>>t;vs.push_back(t);}…

书生 浦语 大模型趣味 Demo

目录 一. 部署 InternLM2-Chat-1.8B 模型进行智能对话 1. 环境准备 2. 下载模型参数 3. 运行Demo 二. 部署实战营 八戒-Chat-1.8B 模型 1. 下载Demo仓库 2. 启动web服务端加载八戒模型&#xff1a; 3. 将SSH远程端口映射到本地 4. 在本地浏览器打开&#xff1a;http:/…

ECOLOGY文档发布后发现有错漏解决方案

OAECOLOGY文档发布后发现有错漏解决方案 1、从流程查到文档ID select docids from workflow_requestbase where requestid4176374 docids&#xff1d;2649858 &#xff12;、从文档ID查到并验证文档是否正确。 select * from docdetail where id2649858 &#xff13;、从文档ID…

Python抓取抖音直播间数据:技术探索与实践

目录 一、引言 二、技术准备 三、分析抖音直播间网页结构 四、编写爬虫代码 五、处理反爬虫机制 六、数据清洗与存储 七、总结 一、引言 随着互联网的快速发展&#xff0c;直播行业已成为当下的热门领域。抖音作为其中的佼佼者&#xff0c;吸引了大量的用户和主播。对于…

Windows中Microsoft Edge兼容性问题修复方案

针对Microsoft Edge浏览器在Windows系统中出现的兼容性问题解决步骤和策略&#xff1a; 作者是更改了注册表解决的&#xff0c;问题不一&#xff0c;大家遇到兼容性问题先按照第7个情况进行设置&#xff0c;大部分人是这个情况&#xff01; 清理缓存和Cookies 按快捷键:ctrlshi…

元宇宙虚拟空间的场景构造(二)

前言 该文章主要讲元宇宙虚拟空间的场景构造&#xff0c;基本核心技术点&#xff0c;不多说&#xff0c;直接引入正题。 场景的构造 使用引入的天空模块 this.sky new Sky(this); 在Sky模块里&#xff0c;有设置对其中的阳光进行不同时间段的光线处理。而天空又是怎么样的…

STM32 DWT数据观察触发器作为延时函数的使用

STM32 DWT数据观察触发器作为延时函数的使用 &#x1f4d1;DWT(Data Watchpoint and Trace数据观察触发器&#xff09;描述 &#x1f4dd;DWT是属于处理器内核单元中的调试组件之一&#xff0c;由四个比较器组成。它们可配置为&#xff1a;硬件监视点或对ETM或PC采样器或数据地…

dcoker 下redis设置密码

修改Docker里面Redis密码 Redis是一个开源的内存数据结构存储系统&#xff0c;常用于缓存、消息队列和数据持久化等场景。在使用Docker部署Redis时&#xff0c;默认情况下是没有设置密码的&#xff0c;这可能会导致安全隐患。因此&#xff0c;为了保证数据的安全性&…

高性能服务系列【十二】终篇:等待的代价

上一篇《主题匹配》入选CSDN的区块链领域内容榜&#xff0c;最早我看到的时候是排行榜34名&#xff0c;写这篇文章的时候已经落到了46名。虽然我没有觉得和区域链有什么关系&#xff0c;估计入选的原因是那篇文章涉及到几个算法吧。 在整个高性能服务系列中&#xff0c;我很少…

蓝桥杯真题Day44 倒计时10天 练了六道真题 !

[蓝桥杯 2020 省 B2] 平面切分 题目描述 平面上有 N 条直线, 其中第 i 条直线是 yAi​⋅xBi​ 。请计算这些直线将平面分成了几个部分。 输入格式 第一行包含一个整数 N。 以下 N 行, 每行包含两个整数 Ai​,Bi​。 输出格式 一个整数代表答案。 代码表示 #include<…

基于SpringBoot的图书馆管理系统设计与实现

介绍 基于&#xff1a;java8 SpringBoot thymeleaf MySQL8.0.17 mybatis-plus maven Xadmin 实现图书馆管理系统 系统要实现如下的基本管理功能&#xff1a; &#xff08;1&#xff09;用户分为两类&#xff1a;管理员&#xff0c;一般用户。 &#xff08;2&#xff09…

java利用多线程,线程池加快任务处理时间,等待所有线程结束,数据统一处理

遇到了业务上处理很慢的情况&#xff0c;都可以用多线程解决&#xff0c;这是原先未优化的代码 /*** 导出excel*/GetMapping("/export/excel")ApiOperationSupport(order 11)ApiOperation(value "导出excel", notes "传入gaugeRecord")public…

Day57:WEB攻防-SSRF服务端请求Gopher伪协议无回显利用黑白盒挖掘业务功能点

目录 SSRF-原理&挖掘&利用&修复 SSRF无回显解决办法 SSRF漏洞挖掘 SSRF协议利用 http:// &#xff08;常用&#xff09; file:/// &#xff08;常用&#xff09; dict:// &#xff08;常用&#xff09; sftp:// ldap:// tftp:// gopher:// &#xff08;…