postgresql - TypeORM:[364] 错误:表 "userorganisation"在字符 401 缺少 FROM 子句条目

标签 postgresql typescript nestjs typeorm

在使用 TypeORM 并连接我为 Postgres 数据库设置的表时,我遇到了一个非常有趣的问题。我想通了,但我想我会在这里为遇到类似问题的任何其他人发布信息。

我在数据库中设置了 3 个表:userorganisationuser_organisation

这样做的想法是,一个用户可以属于许多组织,名为 user_organisation 的表将用户映射到这些组织。所以我的实体看起来像这样,

user.entity.ts

import { TimestampedEntity } from '@shared/entities/timestamped.entity';
import { Organisation } from '@user/entities/organisation.entity';
import { UserOrganisation } from '@user/entities/user-organisation.entity';
import { Column, Entity, Index, JoinTable, ManyToMany, OneToMany, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
@Index(['email', 'password'])
export class User extends TimestampedEntity {
    @PrimaryGeneratedColumn()
    userId: number;

    @Column({
        length: 64
    })
    username: string;

    @Column({
        length: 500
    })
    email: string;

    @Column({
        length: 255
    })
    password: string;

    @Column({
        type: 'json',
    })
    details: any;

    @Column({
        nullable: true
    })
    refreshToken: string;

    @OneToMany(type => UserOrganisation, userOrganisation => userOrganisation.user)
    @JoinTable()
    userOrganisations: UserOrganisation[];
}

user-organisation.entity.ts

import { Organisation } from '@user/entities/organisation.entity';
import { User } from '@user/entities/user.entity';
import { Column, Entity, JoinColumn, ManyToOne, OneToOne, PrimaryColumn, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class UserOrganisation {
    @ManyToOne(type => User, user => user.userOrganisations, { primary: true })
    user: User;

    @ManyToOne(type => Organisation, organisation => organisation.userOrganisations, { primary: true })
    organisation: Organisation;
}

organisation.entity.ts

import { TimestampedEntity } from '@shared/entities/timestamped.entity';
import { UserOrganisation } from '@user/entities/user-organisation.entity';
import { User } from '@user/entities/user.entity';
import { Column, Entity, JoinColumn, JoinTable, ManyToMany, ManyToOne, OneToMany, OneToOne, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class Organisation extends TimestampedEntity {
    @PrimaryGeneratedColumn()
    orgId: number;

    @Column({
        length: 255
    })
    name: string;

    @Column({
        type: 'json'
    })
    details: any;

    @OneToMany(type => UserOrganisation, userOrganisation => userOrganisation.organisation)
    userOrganisations: UserOrganisation[];
}

然后我尝试运行以下查询,

this.userRepository.createQueryBuilder('user')
    .where('user.email = :email', { email })
    .innerJoin(UserOrganisation, 'userOrganisation', 'user.userId = userOrganisation.userUserId')
    .getOne();

这是我收到的错误信息,

ERROR:  missing FROM-clause entry for table "userorganisation" at character 401

最终的查询打印出来是这样的,

SELECT "user"."createdAt" AS "user_createdAt"
 , "user"."updatedAt" AS "user_updatedAt"
 , "user"."userId" AS "user_userId"
 , "user"."username" AS "user_username"
 , "user"."email" AS "user_email"
 , "user"."password" AS "user_password"
 , "user"."details" AS "user_details"
 , "user"."refreshToken" AS "user_refreshToken" 
 FROM "user" "user" 
 INNER JOIN "user_organisation" "userOrganisation" 
      ON      "user"."userId" = userOrganisation.userUserId 
 WHERE "user"."email" = $1

我修复它的方法如下所述。

最佳答案

我在查询中注意到的,

SELECT "user"."createdAt" AS "user_createdAt", "user"."updatedAt" AS "user_updatedAt", "user"."userId" AS "user_userId", "user"."username" AS "user_username", "user"."email" AS "user_email", "user"."password" AS "user_password", "user"."details" AS "user_details", "user"."refreshToken" AS "user_refreshToken" FROM "user" "user" INNER JOIN "user_organisation" "userOrganisation" ON "user"."userId" = userOrganisation.userUserId WHERE "user"."email" = $1

user 表和 userOrganisation 表在连接条件中是否存在差异,

"user"."userId" = userOrganisation.userUserId

user 表自动包含在引号中,但 userOrganisation 不是...所以我将代码更改为以下内容,

this.userRepository.createQueryBuilder('user')
        .where('user.email = :email', { email })
        .innerJoin(UserOrganisation, 'userOrganisation', '"user"."userId" = "userOrganisation"."userUserId"')
        .getOne();

如果您看上面的内容,我已经在连接条件中添加了引号。现在一切正常:)

希望这对您有所帮助!

关于postgresql - TypeORM:[364] 错误:表 "userorganisation"在字符 401 缺少 FROM 子句条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52025907/

相关文章:

typescript - 属性 'id' 在类型 'T' 上不存在。(2339)Typescript 泛型错误

javascript - onbeforeunload 在 react 组件中不起作用

typescript - 从 Tree 组件拖放到 DataTable

nestjs - nestjs 是如何获取请求中的 cookie 的?

mysql - Typeorm 实体插入而不同步

javascript - 如何更新NestJS Swagger模块但使用OpenAPI 2.0(Swagger)?

postgresql - pgAdmin III (pgadmin3_92.x86_64 0 :1. 16.1-1.rhel6) 无法启动

sql - Postgres 根据其他查询的结果更新设置值

ruby-on-rails - 在 Rails 3.2 中实现计数时出错

sql - 带有 LIKE 语句的 PostgreSQL hstore 列