首页 > 解决方案 > typeorm:如何正确使用 IsNotNull/IsNull?

问题描述

我们创建了一个辅助函数来where更轻松地创建 s。它适用于 eq、neq、lt 和 gt。现在我们尝试添加 is null/is not null (对于日期列,不确定是否重要)。

该函数的关键部分如下所示:

// This is ran in a loop for every attribute
const query = `${attribute}` ${comparator} :value${index}`;

// if the checked 'value' is NULL then use IsNull(), same for NOT NULL, otherwise simply use value 
const params = { [`value${index}`]: value == 'NULL' ? IsNull() : value === 'NOT NULL' ? Not(IsNull()) : value};

// Add this (sub)query to the qb
qb.andWhere(query, params);

现在我们收到一条错误消息:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '<code>_type = 'not', _value= '[object Object]', _useParameter= true, `_multipl' 附近使用正确的语法”

价值是[object Object]-如果我们使用哪种有意义IsNotNull(),对吗?

据我从这条评论IsNull()中了解到,Not(IsNull())应该像我们努力的那样工作。我们使用@nestjs/typeorm 7.1.5。

标签: sqlnestjstypeorm

解决方案


要检查 NULL 你需要

qb.andWhere(`${attribute} IS NULL`)

要检查 NOT NULL 你需要

qb.andWhere(`${attribute} IS NOT NULL`)

(注意:对于这些情况,省略第二个参数,参数)。

从您的代码看来,您正在使用字符串值 'NULL' 和 'NOT NULL' 作为值参数,并将这些值作为特殊情况进行检查。您的代码现在将如下所示:

if ((value == 'NULL' && comparator == '=') || (value == 'NOT NULL' && comparator == '<>'))
    qb.andWhere(`${attribute} IS NULL`);
if ((value == 'NOT NULL' && comparator == '=') || (value == 'NULL' && comparator == '<>'))
    qb.andWhere(`${attribute} IS NOT NULL`);
else
    qb.andWhere(`${attribute} ${comparator} :value${index}`, { [`value${index}`]: value});

(在上面的代码中,我检查了标准 SQL 比较运算符的 '=' 和 '<>'。如果您的 SQL 方言使用 'eq' 和 'ne' 代替了你提到的 '=' 和 '<>'在您的问题中,您需要更改上面的代码。如果是这样,请更新您的问题并添加适当的标签以说明您正在使用哪个 SQL 数据库)。

当你测试这个的时候,我建议你打开 TypeOrm full logging,这样你就可以看到实际生成的 SQL 并且可以快速解决任何问题。请参阅TypeOrm 日志记录


推荐阅读