【问题标题】:TypeORM PostgreSQL select where JSON field equals some valueTypeORM PostgreSQL 选择 JSON 字段等于某个值的位置
【发布时间】:2018-10-15 00:29:45
【问题描述】:

目标:编写一个选择查询,返回 state 等于“florida”的所有行。

实体栏:

  @Column({ type: 'json'})
  public address: Address;

示例列值:

{"city": "miami", "state": "florida"}

示例查询(不起作用):

getManager().getRepository(User)
    .createQueryBuilder('user')
    .select()
    .where('user.address.state =:state', {state: "florida"})

typeorm 目前是否支持此功能?如果是这样,我需要如何修改 where 子句以返回正确的行?

【问题讨论】:

    标签: postgresql typeorm


    【解决方案1】:

    搞定了。

    正确的语法:

    .where(`user.address ::jsonb @> \'{"state":"${query.location}"}\'`)
    

    【讨论】:

    • 我应该补充一点,以了解使用上述语法时可能的 SQL 注入。必须正确清理任何传入的查询。
    【解决方案2】:

    另一种可能的解决方案(无法注入原始 SQL):

    .where('user.address ::jsonb @> :address', {
        address: {
            state: query.location
        }
    })
    

    这样,TypeORM 将生成一个以

    结尾的 SQL 查询
    WHERE user.address ::jsonb @> $1
    

    查询将给出例如

    { state: 'florida' }
    

    作为查询参数替换查询中的正确值($1)。

    来源:主要是原题+答案(谢谢!)+自己测试+https://www.postgresql.org/docs/9.4/functions-json.html

    【讨论】:

      【解决方案3】:

      它对我有用:

      .getRepository(User)
      .createQueryBuilder('user')
      .where(`user.address->>'state' = :state`, {state: "florida"})
      

      【讨论】:

        【解决方案4】:
            return getRepository(User)
            .createQueryBuilder()
            .where('address @> :address', {
              address: { state: "florida" },
            })
            .getMany();
        

        【讨论】:

          【解决方案5】:

          试试这个:

             const users = await getManager()
            .getRepository(UserEntity)
            .createQueryBuilder(`user`)
            .where("address->>'state' = :state")
            .setParameters({ state })
            .getMany();
          

          【讨论】:

            【解决方案6】:

            这对我有用。我只是使用类似 TypeORM 的函数。

            .find({
               where: {
                  address: Like(`%${add what to search for here}%`),
               },
            });
            

            【讨论】:

              猜你喜欢
              • 2012-10-04
              • 1970-01-01
              • 2018-08-09
              • 2021-09-03
              • 2017-05-04
              • 1970-01-01
              • 1970-01-01
              • 2014-04-13
              • 1970-01-01
              相关资源
              最近更新 更多