TypeORM 中 .limit() 和 .take() 之间的区别

Den*_*kin 21 query-builder node.js typeorm

我对具有相似目的的不同 TypeORM 方法感到困惑。来自 TypeORM 文档:

\n
    \n
  • .take()\xe2\x80\x94 分页限制。设置要获取的最大实体数。
  • \n
  • .skip()\xe2\x80\x94 分页偏移量。设置要跳过的实体数量。
  • \n
\n

我不太理解“分页限制/偏移”的含义。但是,不幸的是,我找不到任何有关区分的信息,例如.take().limit()信息。我决定在 TypeORM 的源代码中查看这些方法的描述:

\n
    \n
  • .limit()\xe2\x80\x94 设置 LIMIT - 要选择的最大行数。请注意,如果您使用联接,它可能不会按您预期的方式工作。如果您想实现分页,并且您的查询中有 join,那么请使用 take 方法。
  • \n
  • .offset()\xe2\x80\x94 设置的 OFFSET - 选择偏移。请注意,如果您使用联接,它可能不会按您预期的方式工作。如果您想实现分页,并且您的查询中有 join,那么请使用skip 方法。
  • \n
\n

为什么这两种方法不能用于分页呢?那么他们的目的是什么?请问谁能给我提供使用这 4 种方法的清晰示例吗?提前致谢。

\n

小智 24

不同之处在于,takeskip不会成为您将执行的查询的一部分,typeorm 在获得结果后执行它。当您的查询包含任何类型的联接时,这总体上是有用的,因为结果与我们的 TypeORM 映射不同。

另一方面,limitoffset包含在查询中,但如果您使用联接,则可能无法按您的预期工作。例如,如果您有一个与 B 具有 OneToMany 关系的实体 A,并且您尝试获取 A 上的前三个条目(使用限制 3)并与 B 进行连接,如果第一个条目有 3 个 B,那么您将只得到一个A。

看一下描述,我们可以看到如果我们使用offset(与limit相同)

SelectQueryBuilder 说明

  • 如果 TypeORM 首先将整个结果集加载到内存中然后将其丢弃,那么对大型结果集使用 take 和skip 听起来是一个坏主意,而不是作为分页选项。 (4认同)
  • 所以你的意思是“.limit()”可能会导致意外行为?如果我想“限制”3个实体A加入B,可能需要1个实体A和3个实体B,对吧?但为什么? (2认同)