我怎样才能在typeorm find选项中出现null条件?

时间:2017-10-22 22:38:01

标签: sql where-clause typeorm

我在查询中使用typeorm查找选项 我怎样才能在where子句中有IS NULL条件?

5 个答案:

答案 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