我在查询中使用typeorm查找选项 我怎样才能在where子句中有IS NULL条件?
答案 0 :(得分:9)
如果有人在寻找 NOT NULL,它会是这样的:
import { IsNull, Not } from "typeorm";
return await getRepository(User).findOne({
where: {
username: Not(IsNull())
}
});
答案 1 :(得分:4)
另一种方法是您可以使用IsNull()
函数,例如:
import { IsNull } from "typeorm";
return await getRepository(User).findOne({
where: {
username: IsNull()
}
});
答案 2 :(得分:0)
您可以将QueryBuilder用于此目的:
const users = await userRepository.createQueryBuilder("user")
.where("user.name IS NULL")
.getMany();
答案 3 :(得分:0)
除了Hangneox答案外,您还应该知道您有很多预定义的运算符。
这来自定义它的文件:
export declare type FindOperatorType = "not" |
"lessThan" |
"lessThanOrEqual" |
"moreThan" |
"moreThanOrEqual" |
"equal" |
"between" |
"in" |
"any" |
"isNull" |
"like" |
"raw";
以上各项均可在此处的“操作员”部分中进行设置:
{
where: {
propertyToCheck: <Operator>
}
}
您只需从@typeorm包中导入它,然后将其像函数一样使用,例如LessThan():
import { Repository, Between, IsNull, LessThan } from 'typeorm';
{
where: {
age: LessThan(50)
}
}
这是了解您是否想要掌握typeorm的强大而重要的工具:) 祝你好运!
答案 4 :(得分:0)
我真的不喜欢使用TypeORM的QueryBuilder
,因为我认为在使用FindConditions
时应按预期对待。
不幸的是,带有类似下面的代码:
async articleRequests(
accepted?: ArticleRequestAcceptance,
): Promise<ArticleRequest[]> {
const where: FindConditions<ArticleRequest>[] | FindConditions<ArticleRequest> = {};
if (accepted !== undefined) {
switch (accepted) {
case ArticleRequestAcceptance.Accepted:
where.accepted = true;
break;
case ArticleRequestAcceptance.Rejected:
where.accepted = false;
break;
case ArticleRequestAcceptance.NotReviewedYet:
where.accepted = undefined;
break;
}
}
return await ArticleRequest.find({ where }).catch(reason => {
throw reason.message;
});
}
TypeORM为您提供了一个如下所示的SQL查询:
SELECT '...' WHERE "ArticleRequest"."accepted" = NULL
因为从TypeORM日志输出中可以看到,... WHERE "ArticleRequest"."accepted" = @0 -- PARAMETERS: [null]
将具有undefined
值(在这种情况下为accepted
)的属性转换为参数内的null
数组,然后将它们简单地注入到SQL字符串中。
SQL标准规定,与null
的任何比较都会导致null
,因此对于SQL中的比较操作符(如=
或<>
),这没有任何意义,但是原因是与null进行比较意味着“未知”,因此为什么此类查询不会返回任何结果。如果您问我,SQL在这里坏了。
是的,正如@hungneox所说,解决方案是使用IsNull()
,它针对您需要以FindOperator
而不是{{1 }}。
赞:
IS NULL