在使用 TypeORM 操作数据库时,我们常常需要查询存储在数组字段中的数据。在 PostgreSQL 中,这样的字段通常被定义为数组类型。在 TypeORM 中,我们可以通过几种方式来查询这样的数组字段,这里我将介绍几种常用的查询方法。
1. 判断数组中是否包含某个值
假设我们有一个名为 User
的实体,其中有一个 hobbies
字段,类型为字符串数组。我们希望查询所有喜好中包含 "reading" 的用户。
typescriptimport { getRepository } from "typeorm"; import { User } from "./entity/User"; async function findUsersByHobby() { const userRepository = getRepository(User); const users = await userRepository.find({ where: { hobbies: "reading" } }); return users; }
2. 使用 @>
, <@
, &&
运算符
PostgreSQL 提供了特殊的数组运算符来帮助我们进行更复杂的查询。例如:
@>
表示左边数组是否包含右边数组。<@
表示左边数组是否被右边数组包含。&&
表示两个数组是否有交集。
示例:查询喜好包含至少包含 "reading" 和 "cooking" 的用户
typescriptimport { getRepository } from "typeorm"; import { User } from "./entity/User"; async function findUsersByMultipleHobbies() { const userRepository = getRepository(User); const users = await userRepository.createQueryBuilder("user") .where("user.hobbies @> ARRAY[:...hobbies]", { hobbies: ["reading", "cooking"] }) .getMany(); return users; }
3. 查询数组长度
有时候我们需要根据数组的长度来进行查询,例如找出喜好超过 3 个的用户。
typescriptimport { getRepository } from "typeorm"; import { User } from "./entity/User"; async function findUsersByHobbiesCount() { const userRepository = getRepository(User); const users = await userRepository.createQueryBuilder("user") .where("array_length(user.hobbies, 1) > :count", { count: 3 }) .getMany(); return users; }
以上就是在 TypeORM 中查询数组的几种方法。通过利用原生 SQL 功能和 TypeORM 提供的方法,我们可以灵活地处理各种数组相关的查询需求。
2024年6月29日 12:07 回复