有人可以向我解释在我的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。
答案 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为您提供的所有帮助。