Postgres和TypeORM WHERE子句过滤器JOIN表 但是

问题描述

嗨,我正在尝试将TypeORM与postgres结合使用,以从数据库中查询某些用户。

我有两个模型:用户成绩,它一对多的关系,用户可以有多个成绩

用户模型:

import {
    Entity,Column,PrimaryGeneratedColumn,ManyToOne,OneToMany,Index,} from 'typeorm';
import { Grade } from './grade.entity';

@Entity('users')
export class User {
    @PrimaryGeneratedColumn({ name: 'id',type: 'integer' })
    id: number;

    @Index()
    @Column()
    name: string;

    @Column()
    surname: string;


    @OneToMany(() => Grade,(grade) => grade.user,{
        onUpdate: 'CASCADE',onDelete: 'CASCADE',cascade: true,})
    grades: Grades[];


}

成绩模型。

import {
    Entity,} from 'typeorm';
import { User } from './User.entity';

@Entity('grades')
export class Grade {
    @PrimaryGeneratedColumn({ name: 'id',type: 'integer' })
    id: number;

    @Column()
    value: string;

    @ManyToOne(() => User,(asset) => user.grades)
    user: User;
}

我有以下查询:

this.createQueryBuilder('users')
            .innerJoinAndSelect('users.grades','grade')
            .where('grade.value IN (:5)',{ ips })
            .getMany();

问题在于,运行查询时,它还会过滤用户内部的成绩

所以我有多个用户和这样的等级:

Users(name: 'John',surname: 'Doe')(name: 'Stiv',surname: 'Jovic ') and grades -> ( value: 1 ),( value:2 ),( value: 3 ),( value:4 ),( value:5),( value:6),( value:2)

我想获得所有5年级的用户,所以我是这样的:

User(name: 'John) => grades (value: 1),(value: 2),(value: 5)

但是知道我获得了5级用户,但是它也过滤了联接表,所以我得到了这样的数据:

User(name: 'John') => grades (value:5)

解决方法

首先,重要的是要了解联接类型,您使用了INNER JOIN,它将始终只返回用户和成绩的交集。

enter image description here

要选择所有成绩并仅加入值为5的成绩的用户,应使用RIGHT JOIN,以便表1为users,表2为grades,交集将是5年级以上的用户。

enter image description here

但是

由于typeorm的github中的this comment,在使用ORM时无法实现RIGHT JOIN

比你能做什么?

  1. 选择所有成绩和具有该成绩值条件的LEFT JOIN用户:

表1是grades,表2是users

enter image description here

this.createQueryBuilder('grades')
            .leftJoinAndSelect('grades.user','user','grades.value IN (:5)')
            .getMany();

  1. 您可以编写原始查询,例如:
this.gardesRepository.query(`
    SELECT * FROM grades
    RIGHT JOIN users ON grades.user_id = users.id AND grades.value IN (:5);
`)
       

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...