zoukankan      html  css  js  c++  java
  • typeorm查询两个没有关联关系的实体

    Post实体

    @Entity({ name: 'post', schema: 'public' })
    export class Post {
        @PrimaryGeneratedColumn()
        id: number;
    
        @Column({ nullable: false })
        title: string;
    
        @Column({
            type: 'text', nullable: false
        })
        content: string;
    
    }

    PostExtend 实体

    在post实体中设置postId存放post主键id

     1 @Entity({ name: 'postExtend', schema: 'public' })
     2 export class PostExtend {
     3     @PrimaryGeneratedColumn()
     4     id: number;
     5 
     6     @Column({ nullable: false })
     7     postId: number;
     8 
     9     @Column({ nullable: true })
    10     likeCount: number;
    11 
    12     @Column({ nullable: true })
    13     readCount: number;
    14 
    15     @Column({ nullable: true })
    16     forwardCount: number;
    17 
    18 }

     Post和PostExtend中没有设置关联关系,所以我们并不能在find option中关联两个实体进行连表查询。

    但是可以用queryBuilder 

    1 const posts = await getConnection()
    2             .createQueryBuilder(Post, 'post')
    3             .leftJoinAndSelect(PostExtend, 'postExtend', 'post.id=postExtend.postId')
    4             .getManyAndCount()
    5         return posts;

    查询结果

    [
        [
            {
                "id": 1,
                "title": "北京申奥成功",
                "content": "2003年奥林匹克运动会将在北京举行,北京欢迎你!"
            }
        ],
        1
    ]

     上面的查询结果中并没有PostExtend的数据,这是因为不能确定两个实体之间的关联关系,所以无法确定查询结果的显示形式。

    当然,也可以通过 getRawMany() 方法获取原生字段来获取PostExtend的信息,但是这样的查询结果显示并不友好。

    1 const posts = await getConnection()
    2             .createQueryBuilder(Post, 'post')
    3             .leftJoinAndSelect(PostExtend, 'postExtend', 'post.id=postExtend.postId')
    4             .getRawMany()
    5         return posts;

    原生的查询结果:

     1 [
     2     {
     3         "post_id": 1,
     4         "post_title": "北京申奥成功",
     5         "post_content": "2003年奥林匹克运动会将在北京举行,北京欢迎你!",
     6         "postExtend_id": 1,
     7         "postExtend_postId": 1,
     8         "postExtend_likeCount": 999,
     9         "postExtend_readCount": 10000,
    10         "postExtend_forwardCount": 666
    11     }
    12 ]

     如果想要将原生字段映射到属性,可以使用 leftJoinAndMapOne() ,如果时一对多还可以使用 leftJoinAndMapMany() 

    1 @Get('all')
    2     public async getPosts(@Query() query: any) {
    3         const posts = await getConnection()
    4             .createQueryBuilder(Post, 'post')
    5             .leftJoinAndMapOne('post.postExtend',PostExtend, 'postExtend', 'post.id=postExtend.postId')
    6             .getManyAndCount()
    7         return posts;
    8     }

    上面代码的查询结果如下:

     1 [
     2     [
     3         {
     4             "id": 1,
     5             "title": "北京申奥成功",
     6             "content": "2003年奥林匹克运动会将在北京举行,北京欢迎你!",
     7             "postExtend": {
     8                 "id": 1,
     9                 "postId": 1,
    10                 "likeCount": 999,
    11                 "readCount": 10000,
    12                 "forwardCount": 666
    13             }
    14         }
    15     ],
    16     1
    17 ]

     postExtend的数据被映射到post.postExtend,这样的结果清晰明了。

  • 相关阅读:
    project b2c_performance / capacity
    WebServer Roxen
    OS + UNIX AIX /etc/services
    但行好事,莫问前程 All In One
    学习什么语言的问题,其实,不是一个问题......
    不想当将军的学生,不是好程序员——数据访问层DAL
    C#如何用Graphics画出一幅图表
    混蛋的面试题——《大话设计模式》读后感
    编程也讲禅,您读过《金刚经》吗?——ADO.NET核心类的灭度与SQLHelper的诞生——十八相送(上)
    C#如何开发扫雷游戏
  • 原文地址:https://www.cnblogs.com/zzk96/p/11397223.html
Copyright © 2011-2022 走看看