- TypeORM教程
- TypeORM - 主页
- TypeORM - 简介
- TypeORM - 安装
- TypeORM - 创建一个简单的项目
- TypeORM - 连接 API
- TypeORM - 实体
- TypeORM - 关系
- TypeORM - 使用存储库
- TypeORM - 使用实体管理器
- TypeORM - 查询生成器
- TypeORM - 查询操作
- TypeORM - 交易
- TypeORM - 索引
- TypeORM - 实体监听器和日志记录
- 使用 JavaScript 进行 TypeORM
- TypeORM - 使用 MongoDB
- 使用 Express 进行 TypeORM
- TypeORM - 迁移
- TypeORM - 使用 CLI
- TypeORM 有用资源
- TypeORM - 快速指南
- TypeORM - 有用的资源
- TypeORM - 讨论
TypeORM - 查询生成器
查询构建器用于以简单的方式构建复杂的 SQL 查询。它是从 Connection 方法和 QueryRunner 对象初始化的。
我们可以通过三种方式创建 QueryBuilder。
联系
考虑一个如何使用连接方法使用 QueryBuilder 的简单示例。
import {getConnection} from "typeorm"; const user = await getConnection() .createQueryBuilder() .select("user") .from(User, "user") .where("user.id = :id", { id: 1 }) .getOne();
实体经理
让我们使用实体管理器创建一个查询生成器,如下所示 -
import {getManager} from "typeorm"; const user = await getManager() .createQueryBuilder(User, "user") .where("user.id = :id", { id: 1 }) .getOne();
存储库
我们可以使用存储库来创建查询生成器。如下所述,
import {getRepository} from "typeorm"; const user = await getRepository(User) .createQueryBuilder("user") .where("user.id = :id", { id: 1 }) .getOne();
别名
别名与 SQL 别名相同。我们使用 QueryBuilder 为 Student 表创建别名,如下所述 -
import {getConnection} from "typeorm"; const user = await getConnection() .createQueryBuilder() .select("stud") .from(Student, "stud")
这个查询相当于,
select * from students as stud
参数
参数用作查询中动态值的占位符。在许多情况下,查找不同实体对象的查询除了值之外都是相同的。例如,查找不同学生的查询除了学生 ID数据外都是相同的。在这种情况下,我们可以使用学生 ID参数,然后更改该参数来获取不同的学生对象。
参数的另一个重要用途是防止SQL注入。它是现代 Web 应用程序中重要的安全漏洞之一。通过在查询中使用参数,我们可以抵御 SQL 注入攻击。
参数的另一个重要用途是防止SQL注入。它是现代 Web 应用程序中重要的安全漏洞之一。通过在查询中使用参数,我们可以抵御 SQL 注入攻击。
例如
"student.id = :id", { id: 1 }
这里,
:id - 参数名称。
{ id: 1 } - 参数的值
添加表情
本节介绍如何使用表达式。
在哪里
where用于过滤条件符合的记录。
createQueryBuilder("student") .where("student.id = :id", { id: 1 })
这个查询相当于,
select * from students student where student.id=1;
我们还可以在里面使用 AND、OR、NOT、IN 条件。
拥有
简单的having表达式定义如下 -
createQueryBuilder("student") .having("student.id = :id", { id: 1 })
这个查询相当于,
select * from students student having student.id=1;
排序依据
orderby 用于根据字段对记录进行排序。
createQueryBuilder("student") .orderBy("student.name")
这个查询相当于,
select * from students student order by student.name;
通过...分组
它用于根据指定的列对记录进行分组。
createQueryBuilder("student") .groupBy("student.id")
这个查询相当于,
select * from students student group by student.id;
限制
它用于限制行的选择。下面的示例展示了如何在查询生成器中使用限制,
createQueryBuilder("student") .limit(5)
这个查询相当于,
select * from students student limit 5;
抵消
Offset 用于指定跳过结果的行数。它的定义如下 -
createQueryBuilder("student") .offset(5)
这个查询相当于,
select * from students student offset 5;
加入
join 子句用于根据相关列组合两个或多个表中的行。考虑两个实体 -
学生.ts
import {Entity, PrimaryGeneratedColumn, Column, OneToMany} from "typeorm"; import {Project} from "./Project"; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; @OneToMany(type => Project, project => project.student) projects: project[]; }
项目.ts
import {Entity, PrimaryGeneratedColumn, Column, ManyToOne} from "typeorm"; import {Student} from "./Student"; @Entity() export class Project { @PrimaryGeneratedColumn() id: number; @Column() title: string; @ManyToOne(type => Student, student => student.projects) student: Student; }
让我们使用以下查询执行简单的左连接 -
const student = await createQueryBuilder("student") .leftJoinAndSelect("student.projects", "project") .where("student.name = :name", { name: "Student1" }) .getOne();
这个查询相当于,
SELECT student.*, project.* FROM students student LEFT JOIN projects project ON project.student = student.id WHERE student.name = 'Student1'
同样,我们也可以尝试内连接。
无需选择即可加入
我们可以在不使用 select 的情况下连接数据。让我们尝试使用内连接的示例,如下所示 -
const student = await createQueryBuilder("student") .innerJoin("student.projects", "project") .where("student.name = :name", { name: "student1" }) .getOne();
上述查询相当于 -
SELECT student.* FROM students student INNER JOIN projects project ON project.student = student.id WHERE student.name = 'Student1';
分页
如果应用程序中有更多数据,则需要分页、页面滑块或滚动功能。
例如,如果您想在申请中显示前五个学生的项目,
const students = await getRepository(Student) .createQueryBuilder("student") .leftJoinAndSelect("student.projects", "project") .take(5) .getMany();
子查询
它称为另一个查询中的查询或嵌套查询。我们在 FROM、WHERE 和 JOIN 表达式中使用子查询。
简单的例子如下所示 -
const projects = await connection .createQueryBuilder() .select("project.id", "id") .addSelect(subQuery => { return subQuery .select("student.name", "name") .from(Student, "student") .limit(1); }, "name") .from(Project, "project") .getMany();
隐藏字段
如果您的任何列字段被标记为 {select: false} 则该列将被视为隐藏列。考虑以下实体 -
import {Entity, PrimaryGeneratedColumn, Column} from "typeorm"; @Entity() export class Student { @PrimaryGeneratedColumn() id: number; @Column() name: string; @Column({select: false}) address: string; }
这里,
地址字段被标记为隐藏。我们可以使用addSelect方法从列中检索信息。它的定义如下,
const student = await connection.getRepository(Student) .createQueryBuilder() .select("student.id", "student") .addSelect("student.address") .getMany();
获取Sql()
此方法用于获取查询生成器生成的 SQL 查询。它的定义如下 -
const sql = createQueryBuilder("student") .where("student.name = :name", { name: "Student1" }) .orWhere("student.age = :age", { age: 14 }) .getSql();