QueryBuilder的Typeorm WHERE子句中的参数有什么问题?

时间:2019-03-19 11:59:00

标签: typescript query-builder typeorm

有人可以向我解释在我的where子句中使用参数时我做错了什么吗?

这下一个块给了我下面的错误:

@EntityRepository(Something)
export class SomethingRepository extends Repository<Something>{

  findByUserAndSomethingById(userId: number, spotId: number){
    const thing = this.createQueryBuilder('something')
    .where('something.userId = :id', {id: userId})
    .andWhere('something.id = :id',{id: spotId}).getOne();
    return thing;
  }
}
QueryFailedError: column something.userid does not exist

这个请求给了我正确的结果。

@EntityRepository(Something)
export class SomethingRepository extends Repository<Something>{

  findByUserAndSomethingById(userId: number, spotId: number){
    const thing = this.createQueryBuilder('something')
    .where(`"something"."userId" = ${userId}`)
    .andWhere('something.id = :id',{id: spotId}).getOne();
    return thing;
  }
}

更新: 示例repo用于复制,typeorm issue用于github。

3 个答案:

答案 0 :(得分:1)

我不确定,因为它不在documentation中。但是,当我使用TypeORM QueryBuilder对SQL运行查询时,通常需要在别名和字段名之前和之后添加另一个引号。

例如,在您的情况下,您需要使用:.where('"something"."userId"' = :id', {id: userId}),就像在第二个示例:.where('"something"."userId"' = ${userId})中一样。

一种调试方法,通常检查执行失败的查询。是否按照您正常执行所有查询的方式执行了所有查询,或者是否缺少引号。

答案 1 :(得分:1)

原始查询的问题在于参数名称 id 被多次使用:

    .where('something.userId = :id', {id: userId})
    .andWhere('something.id = :id',{id: spotId}).getOne();

根据 docs 中的此注释,这些必须是唯一的。

答案 2 :(得分:0)

解决方案是加载我的实体的关系。据我了解。

findByUserAndSomethingById(userId: number, spotId: number) {
    const thing = this.createQueryBuilder('something')
    .innerJoin('something.user', 'user')
      .where('user.id = :uid', { uid: userId })
      .andWhere('something.id = :sid', { sid: spotId }).getOne();
    return thing;
}

感谢@Mukyuu为您提供的所有帮助。