TypeORM使用find方法查询时多条匹配记录仅返回一条问题
问题根因
你定义的实体中,将Invoiceno字段标注为了@PrimaryColumn()(单值主键),TypeORM的主键约束要求单值主键的取值全局唯一,因此在执行查询时,TypeORM会默认匹配到第一条符合主键条件的记录后就终止查询,哪怕你的数据库表中实际没有给Invoiceno设置主键约束、存在重复值,也会受实体定义的影响只返回单条结果。
解决方案
根据你的业务场景二选一调整即可:
- 若
Invoiceno本身不是表的唯一主键,直接修改实体定义,把Invoiceno的装饰器改为普通@Column(),给表中实际的主键字段添加对应的主键装饰器即可:
import { Entity, Column, PrimaryColumn } from "typeorm"; @Entity({ name: 'monthly_invoice_rollup' }) export class MonthlyInvoiceRollup { // 改为普通字段 @Column() Invoiceno: string; // 给实际的主键字段加@PrimaryColumn,若为联合主键则给多个字段加该装饰器 @PrimaryColumn() ClientID: string; @Column() Rollup_code: string; @Column() Rollup_desc: string; }
- 若该表没有天然的唯一主键字段,可以新增一个自增ID作为无关主键:
import { Entity, Column, PrimaryGeneratedColumn } from "typeorm"; @Entity({ name: 'monthly_invoice_rollup' }) export class MonthlyInvoiceRollup { // 新增自增主键 @PrimaryGeneratedColumn() id: number; @Column() Invoiceno: string; @Column() ClientID: string; @Column() Rollup_code: string; @Column() Rollup_desc: string; }
调整完实体定义后重新执行原有查询逻辑,即可返回所有Invoiceno = "134"的匹配记录。
注意:如果是生产环境已上线的表,不要开启TypeORM的自动同步表结构功能,需要手动将数据库表的主键约束调整为和实体定义一致,避免数据丢失。
内容的提问来源于stack exchange,提问作者A.com
相关产品推荐
相关产品推荐

