ä½¿ç¨ Query Builder æ¥è¯¢
- ä»ä¹æ¯
QueryBuilder- å¦ä½å建å使ç¨
QueryBuilder - 使ç¨
QueryBuilderè·åå¼ - ä»ä¹æ¯å«åï¼
- 使ç¨åæ°æ¥è½¬ä¹æ°æ®
- æ·»å
WHEREè¡¨è¾¾å¼ - æ·»å
HAVINGè¡¨è¾¾å¼ - æ·»å
ORDER BYè¡¨è¾¾å¼ - æ·»å
GROUP BYè¡¨è¾¾å¼ - æ·»å
LIMITè¡¨è¾¾å¼ - æ·»å
OFFSETè¡¨è¾¾å¼ - èæ¥
- å èåå·¦è
- ä¸ä½¿ç¨æ¡ä»¶çèæ¥
- èæ¥ä»»ä½å®ä½æè¡¨
- èæ¥åæ å°åè½
- è·åçæçsqlæ¥è¯¢è¯å¥
- è·å¾åå§ç»æ
- æµæ°æ®
- å页
- å é
- æ¥è¯¢é¨ååæ®µ
- 使ç¨åæ¥è¯¢
- éèå
- å¦ä½å建å使ç¨
ä»ä¹æ¯QueryBuilderâ
QueryBuilderæ¯ TypeORM æå¼ºå¤§çåè½ä¹ä¸ ï¼å®å
è®¸ä½ ä½¿ç¨ä¼é
便æ·çè¯æ³æå»º SQL æ¥è¯¢ï¼æ§è¡å¹¶è·å¾èªå¨è½¬æ¢çå®ä½ã
QueryBuilderçç®å示ä¾:
const firstUser = await connection
.getRepository(User)
.createQueryBuilder("user")
.where("user.id = :id", { id: 1 })
.getOne();
å®å°çæä»¥ä¸ SQL æ¥è¯¢ï¼
SELECT
user.id as userId,
user.firstName as userFirstName,
user.lastName as userLastName
FROM users user
WHERE user.id = 1
ç¶åè¿åä¸ä¸ª User å®ä¾:
User {
id: 1,
firstName: "Timber",
lastName: "Saw"
}
å¦ä½å建å使ç¨QueryBuilderâ
æå ç§æ¹æ³å¯ä»¥å建Query Builderï¼
ä½¿ç¨ connection:
import { getConnection } from "typeorm";
const user = await getConnection()
.createQueryBuilder()
.select("user")
.from(User, "user")
.where("user.id = :id", { id: 1 })
.getOne();ä½¿ç¨ entity manager:
import { getManager } from "typeorm";
const user = await getManager()
.createQueryBuilder(User, "user")
.where("user.id = :id", { id: 1 })
.getOne();ä½¿ç¨ repository:
import { getRepository } from "typeorm";
const user = await getRepository(User)
.createQueryBuilder("user")
.where("user.id = :id", { id: 1 })
.getOne();
æ 5 ç§ä¸åçQueryBuilderç±»åå¯ç¨ï¼
SelectQueryBuilder- ç¨äºæå»ºåæ§è¡SELECTæ¥è¯¢ã ä¾å¦ï¼import { getConnection } from "typeorm";
const user = await getConnection()
.createQueryBuilder()
.select("user")
.from(User, "user")
.where("user.id = :id", { id: 1 })
.getOne();InsertQueryBuilder- ç¨äºæå»ºåæ§è¡INSERTæ¥è¯¢ã ä¾å¦ï¼import { getConnection } from "typeorm";
await getConnection()
.createQueryBuilder()
.insert()
.into(User)
.values([{ firstName: "Timber", lastName: "Saw" }, { firstName: "Phantom", lastName: "Lancer" }])
.execute();UpdateQueryBuilder- ç¨äºæå»ºåæ§è¡UPDATEæ¥è¯¢ã ä¾å¦ï¼import { getConnection } from "typeorm";
await getConnection()
.createQueryBuilder()
.update(User)
.set({ firstName: "Timber", lastName: "Saw" })
.where("id = :id", { id: 1 })
.execute();DeleteQueryBuilder- ç¨äºæå»ºåæ§è¡DELETEæ¥è¯¢ã ä¾å¦ï¼import { getConnection } from "typeorm";
await getConnection()
.createQueryBuilder()
.delete()
.from(User)
.where("id = :id", { id: 1 })
.execute();RelationQueryBuilder- ç¨äºæå»ºåæ§è¡ç¹å®äºå ³ç³»çæä½[TBD]ã
ä½ å¯ä»¥å¨å ¶ä¸åæ¢ä»»ä½ä¸åç±»åçæ¥è¯¢æå»ºå¨ï¼ä¸æ¦æ§è¡ï¼åå°è·å¾ä¸ä¸ªæ°çæ¥è¯¢æå»ºå¨å®ä¾ï¼ä¸ææå ¶ä»æ¹æ³ä¸åï¼ã
使ç¨QueryBuilderè·åå¼â
è¦ä»æ°æ®åºä¸è·ååä¸ªç»æï¼ä¾å¦éè¿ id æ name è·åç¨æ·ï¼å¿
须使ç¨getOneï¼
const timber = await getRepository(User)
.createQueryBuilder("user")
.where("user.id = :id OR user.name = :name", { id: 1, name: "Timber" })
.getOne();
è¦ä»æ°æ®åºä¸è·åå¤ä¸ªç»æï¼ä¾å¦ï¼è¦ä»æ°æ®åºä¸è·åææç¨æ·ï¼è¯·ä½¿ç¨getManyï¼
const users = await getRepository(User)
.createQueryBuilder("user")
.getMany();
ä½¿ç¨æ¥è¯¢æå»ºå¨æ¥è¯¢å¯ä»¥è·å¾ä¸¤ç§ç±»åçç»æï¼entities æ raw resultsã
大夿°æ
åµä¸ï¼ä½ åªéè¦ä»æ°æ®åºä¸éæ©çå®å®ä½ï¼ä¾å¦ usersã
为æ¤ï¼ä½ å¯ä»¥ä½¿ç¨getOneågetManyã
使æ¶ä½ éè¦éæ©ä¸äºç¹å®çæ°æ®ï¼æ¯æ¹è¯´ææsum of all user photosã
æ¤æ°æ®ä¸æ¯å®ä½ï¼å®ç§°ä¸ºåå§æ°æ®ã
è¦è·ååå§æ°æ®ï¼è¯·ä½¿ç¨getRawOneågetRawManyã
ä¾å¦ï¼
const { sum } = await getRepository(User)
.createQueryBuilder("user")
.select("SUM(user.photosCount)", "sum")
.where("user.id = :id", { id: 1 })
.getRawOne();
const photosSums = await getRepository(User)
.createQueryBuilder("user")
.select("user.id")
.addSelect("SUM(user.photosCount)", "sum")
.where("user.id = :id", { id: 1 })
.getRawMany();
// ç»æä¼åè¿æ ·: [{ id: 1, sum: 25 }, { id: 2, sum: 13 }, ...]
ä»ä¹æ¯å«åï¼â
æä»¬ä½¿ç¨createQueryBuilderï¼"user"ï¼ã ä½ä»ä¹æ¯"user"ï¼
å®åªæ¯ä¸ä¸ªå¸¸è§ç SQL å«åã
æä»¬å¨ä»»ä½å°æ¹é½ä½¿ç¨å«åï¼é¤éæä»¬å¤çéå®çæ°æ®ã
createQueryBuilder("user") ç¸å½äºï¼
createQueryBuilder()
.select("user")
.from(User, "user");
è¿ä¼çæä»¥ä¸ sql æ¥è¯¢ï¼
SELECT ... FROM users user
å¨è¿ä¸ª SQL æ¥è¯¢ä¸ï¼usersæ¯è¡¨åï¼useræ¯æä»¬åé
ç»è¯¥è¡¨çå«åã
ç¨åæä»¬ä½¿ç¨æ¤å«åæ¥è®¿é®è¡¨ï¼
createQueryBuilder()
.select("user")
.from(User, "user")
.where("user.name = :name", { name: "Timber" });
以ä¸ä»£ç ä¼çæå¦ä¸ SQL è¯å¥ï¼
SELECT ... FROM users user WHERE user.name = 'Timber'
çå°äºå§ï¼æä»¬ä½¿ç¨äºå¨å建æ¥è¯¢æå»ºå¨æ¶åé
çuserå«åæ¥ä½¿ç¨ users 表ã
ä¸ä¸ªæ¥è¯¢æå»ºå¨ä¸éäºä¸ä¸ªå«åï¼å®ä»¬å¯ä»¥æå¤ä¸ªå«åã æ¯ä¸ªéæ©é½å¯ä»¥æèªå·±çå«åï¼ä½ å¯ä»¥éæ©å¤ä¸ªæèªå·±å«åç表ï¼ä½ å¯ä»¥ä½¿ç¨èªå·±çå«åè¿æ¥å¤ä¸ªè¡¨ã ä½ ä¹å¯ä»¥ä½¿ç¨è¿äºå«åæ¥è®¿é®éæ©çè¡¨ï¼ææ£å¨éæ©çæ°æ®ï¼ã
使ç¨åæ°æ¥è½¬ä¹æ°æ®â
æä»¬ä½¿ç¨äºwhere("user.name = :name", { name: "Timber" }).
{nameï¼âTimberâ}代表ä»ä¹ï¼ è¿æ¯æä»¬ç¨æ¥é»æ¢ SQL 注å
¥çåæ°ã
æä»¬å¯ä»¥åï¼whereï¼"user.name ='"+ name +"'ï¼ï¼ä½æ¯è¿ä¸å®å
¨ï¼å 为æå¯è½è¢« SQL 注å
¥ã
å®å
¨çæ¹æ³æ¯ä½¿ç¨è¿ç§ç¹æ®çè¯æ³ï¼whereï¼"user.name =name"ï¼{name:"Timber"}ï¼ï¼å
¶ä¸nameæ¯åæ°åï¼å¼å¨å¯¹è±¡ä¸æå®ï¼ {name:"Timber"}ã
.where("user.name = :name", { name: "Timber" })
æ¯ä¸é¢çç®åï¼
.where("user.name = :name")
.setParameter("name", "Timber")
注æï¼ä¸è¦å¨æ¥è¯¢æå»ºå¨ä¸ä¸ºä¸åçå¼ä½¿ç¨ç¸åçåæ°åç§°ã妿夿¬¡è®¾ç½®ååå¼å°ä¼æåé¢çè¦çã
è¿å¯ä»¥æä¾ä¸ç»å¼ï¼å¹¶ä½¿ç¨ç¹æ®çæ©å±è¯æ³å°å®ä»¬è½¬æ¢ä¸ºSQLè¯å¥ä¸çå¼å表ï¼
.where("user.name IN (:...names)", { names: [ "Timber", "Cristal", "Lina" ] })
该è¯å¥å°çæï¼
WHERE user.name IN ('Timber', 'Cristal', 'Lina')
æ·»å WHERE表达å¼â
æ·»å WHERE 表达å¼å°±åï¼
createQueryBuilder("user").where("user.name = :name", { name: "Timber" });
å°ä¼çæä»¥ä¸ SQL è¯å¥ï¼
SELECT ... FROM users user WHERE user.name = 'Timber'
ä½ å¯ä»¥å° AND æ·»å å°ç°æç WHERE 表达å¼ä¸ï¼
createQueryBuilder("user")
.where("user.firstName = :firstName", { firstName: "Timber" })
.andWhere("user.lastName = :lastName", { lastName: "Saw" });
å°ä¼çæä»¥ä¸ SQL è¯å¥ï¼
SELECT ... FROM users user WHERE user.firstName = 'Timber' AND user.lastName = 'Saw'
ä½ ä¹å¯ä»¥æ·»å OR æ·»å å°ç°æç WHERE 表达å¼ä¸ï¼
createQueryBuilder("user")
.where("user.firstName = :firstName", { firstName: "Timber" })
.orWhere("user.lastName = :lastName", { lastName: "Saw" });
å°ä¼çæä»¥ä¸ SQL è¯å¥ï¼
SELECT ... FROM users user WHERE user.firstName = 'Timber' OR user.lastName = 'Saw'
ä½ å¯ä»¥ä½¿ç¨Bracketså°å¤æçWHEREè¡¨è¾¾å¼æ·»å å°ç°æçWHEREä¸ï¼
createQueryBuilder("user")
.where("user.registered = :registered", { registered: true })
.andWhere(new Brackets(qb => {
qb.where("user.firstName = :firstName", { firstName: "Timber" })
.orWhere("user.lastName = :lastName", { lastName: "Saw" })
å°ä¼çæä»¥ä¸ SQL è¯å¥ï¼
SELECT ... FROM users user WHERE user.registered = true AND (user.firstName = 'Timber' OR user.lastName = 'Saw')
ä½ å¯ä»¥æ ¹æ®éè¦ç»åå°½å¯è½å¤çANDåOR表达å¼ã
å¦æä½ å¤æ¬¡ä½¿ç¨.whereï¼ä½ å°è¦çææä»¥åçWHERE表达å¼ã
注æï¼å°å¿orWhere - å¦æä½ ä½¿ç¨å¸¦æANDåOR表达å¼çå¤æè¡¨è¾¾å¼ï¼è¯·è®°ä½ä»ä»¬å°æ éå¶çå å ã
ææ¶ä½ åªéè¦å建ä¸ä¸ª where å符串ï¼é¿å
使ç¨orWhereã
æ·»å HAVING表达å¼â
æ·»å HAVING表达å¼å¾ç®åï¼
createQueryBuilder("user").having("user.name = :name", { name: "Timber" });
å°ä¼çæä»¥ä¸ SQL è¯å¥ï¼
SELECT ... FROM users user HAVING user.name = 'Timber'
ä½ å¯ä»¥æ·»å AND å°å·²ç»åå¨ç HAVING 表达å¼ä¸ï¼
createQueryBuilder("user")
.having("user.firstName = :firstName", { firstName: "Timber" })
.andHaving("user.lastName = :lastName", { lastName: "Saw" });
å°ä¼çæä»¥ä¸ SQL è¯å¥ï¼
SELECT ... FROM users user HAVING user.firstName = 'Timber' AND user.lastName = 'Saw'
ä½ å¯ä»¥æ·»å OR å°å·²ç»åå¨ç HAVING 表达å¼ä¸ï¼
createQueryBuilder("user")
.having("user.firstName = :firstName", { firstName: "Timber" })
.orHaving("user.lastName = :lastName", { lastName: "Saw" });
å°ä¼çæä»¥ä¸ SQL è¯å¥ï¼
SELECT ... FROM users user HAVING user.firstName = 'Timber' OR user.lastName = 'Saw'
ä½ å¯ä»¥æ ¹æ®éè¦ç»åå°½å¯è½å¤çANDåOR表达å¼ã
å¦æä½¿ç¨å¤ä¸ª.havingï¼åé¢çå°è¦çææä¹åçHAVING表达å¼ã
æ·»å ORDER BY表达å¼â
æ·»å ORDER BY å¾ç®åï¼
createQueryBuilder("user").orderBy("user.id");
å°ä¼çæä¸ä¸ SQL è¯å¥ï¼
SELECT ... FROM users user ORDER BY user.id
ä½ å¯ä»¥å°æåºæ¹åä»ååºæ´æ¹ä¸ºéåºï¼æåä¹äº¦ç¶ï¼ï¼
createQueryBuilder("user").orderBy("user.id", "DESC");
createQueryBuilder("user").orderBy("user.id", "ASC");
ä¹å¯ä»¥æ·»å å¤ä¸ªæåºæ¡ä»¶ï¼
createQueryBuilder("user")
.orderBy("user.name")
.addOrderBy("user.id");
è¿å¯ä»¥ä½¿ç¨æåºå段ä½ä¸ºä¸ä¸ª mapï¼
createQueryBuilder("user").orderBy({
"user.name": "ASC",
"user.id": "DESC"
});
å¦æä½ ä½¿ç¨äºå¤ä¸ª.orderByï¼åé¢çå°è¦çææä¹åçORDER BY表达å¼ã
æ·»å GROUP BY表达å¼â
æ·»å GROUP BY 表达å¼å¾ç®åï¼
createQueryBuilder("user").groupBy("user.id");
å°ä¼çæä»¥ä¸ SQL è¯å¥ï¼
SELECT ... FROM users user GROUP BY user.id
妿è¦ä½¿ç¨æ´å¤ group-by, åå¯ä»¥ä½¿ç¨ addGroupBy:
createQueryBuilder("user")
.groupBy("user.name")
.addGroupBy("user.id");
å¦æä½¿ç¨äºå¤ä¸ª.groupBy ï¼ååé¢çå°ä¼è¦çä¹åææç ORDER BY 表达å¼ã
æ·»å LIMIT表达å¼â
æ·»å LIMIT 表达å¼å¾ç®åï¼
createQueryBuilder("user").limit(10);
å°ä¼çæä»¥ä¸ SQL è¯å¥ï¼
SELECT ... FROM users user LIMIT 10
çæç SQL æ¥è¯¢åå³äºæ°æ®åºçç±»åï¼SQLï¼mySQLï¼Postgres çï¼ã
注æï¼å¦æä½ 使ç¨å¸¦æè¿æ¥æåæ¥è¯¢ç夿æ¥è¯¢ï¼LIMIT å¯è½æ æ³æ£å¸¸å·¥ä½ã
å¦æä½¿ç¨å页ï¼å»ºè®®ä½¿ç¨take代æ¿ã
æ·»å OFFSET表达å¼â
æ·»å SQLOFFSET表达å¼å¾ç®åï¼
createQueryBuilder("user").offset(10);
å°ä¼çæä»¥ä¸ SQL è¯å¥ï¼
SELECT ... FROM users user OFFSET 10
çæç SQL æ¥è¯¢åå³äºæ°æ®åºçç±»åï¼SQLï¼mySQLï¼Postgres çï¼ã
注æï¼å¦æä½ 使ç¨å¸¦æè¿æ¥æåæ¥è¯¢ç夿æ¥è¯¢ï¼OFFSET å¯è½æ æ³æ£å¸¸å·¥ä½ã
å¦æä½¿ç¨å页ï¼å»ºè®®ä½¿ç¨skip代æ¿ã
èæ¥â
å设æä»¥ä¸å®ä½ï¼
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm";
import { Photo } from "./Photo";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(type => Photo, photo => photo.user)
photos: Photo[];
}
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from "typeorm";
import { User } from "./User";
@Entity()
export class Photo {
@PrimaryGeneratedColumn()
id: number;
@Column()
url: string;
@ManyToOne(type => User, user => user.photos)
user: User;
}
ç°å¨è®©æä»¬åè®¾ä½ è¦ç¨ç¨æ·"Timber"å è½½ä»ææç photosï¼
const user = await createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.where("user.name = :name", { name: "Timber" })
.getOne();
ä½ å°ä¼å¾å°ä»¥ä¸ç»æï¼
{
id: 1,
name: "Timber",
photos: [{
id: 1,
url: "me-with-chakram.jpg"
}, {
id: 2,
url: "me-with-trees.jpg"
}]
}
ä½ å¯ä»¥çå°leftJoinAndSelectèªå¨å è½½äºææ Timber ç photosã
第ä¸ä¸ªåæ°æ¯ä½ è¦å è½½çå
³ç³»ï¼ç¬¬äºä¸ªåæ°æ¯ä½ 为æ¤å
³ç³»ç表åé
çå«åã
ä½ å¯ä»¥å¨æ¥è¯¢æå»ºå¨ä¸çä»»ä½ä½ç½®ä½¿ç¨æ¤å«åã
ä¾å¦ï¼è®©æä»¬è·å¾æææªå é¤ç Timber ç photosã
const user = await createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.where("user.name = :name", { name: "Timber" })
.andWhere("photo.isRemoved = :isRemoved", { isRemoved: false })
.getOne();
å°ä¼çæä»¥ä¸ SQL æ¥è¯¢ï¼
SELECT user.*, photo.* FROM users user
LEFT JOIN photos photo ON photo.user = user.id
WHERE user.name = 'Timber' AND photo.isRemoved = FALSE
ä½ è¿å¯ä»¥åè¿æ¥è¡¨è¾¾å¼æ·»å æ¡ä»¶ï¼è䏿¯ä½¿ç¨"where"ï¼
const user = await createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo", "photo.isRemoved = :isRemoved", { isRemoved: false })
.where("user.name = :name", { name: "Timber" })
.getOne();
è¿å°çæä»¥ä¸ sql æ¥è¯¢ï¼
SELECT user.*, photo.* FROM users user
LEFT JOIN photos photo ON photo.user = user.id AND photo.isRemoved = FALSE
WHERE user.name = 'Timber'
å èåå·¦èâ
å¦æä½ æ³ä½¿ç¨INNER JOINè䏿¯LEFT JOINï¼åªé使ç¨innerJoinAndSelectï¼
const user = await createQueryBuilder("user")
.innerJoinAndSelect("user.photos", "photo", "photo.isRemoved = :isRemoved", { isRemoved: false })
.where("user.name = :name", { name: "Timber" })
.getOne();
This will generate:
SELECT user.*, photo.* FROM users user
INNER JOIN photos photo ON photo.user = user.id AND photo.isRemoved = FALSE
WHERE user.name = 'Timber'
LEFT JOINåINNER JOINä¹é´çåºå«å¨äºï¼å¦ææ²¡æä»»ä½ photosï¼INNER JOINå°ä¸ä¼è¿å userã
å³ä½¿æ²¡æ photosï¼LEFT JOINä¹ä¼è¿å userã
è¦äºè§£æå
³ä¸åè¿æ¥ç±»åçæ´å¤ä¿¡æ¯ï¼è¯·åé
SQL ææ¡£.
ä¸ä½¿ç¨æ¡ä»¶çèæ¥â
ä½ å¯ä»¥å¨ä¸ä½¿ç¨æ¡ä»¶çæ
åµä¸èæ¥æ°æ®ã
è¦åå°è¿ä¸ç¹ï¼ä½¿ç¨leftJoinæinnerJoinï¼
const user = await createQueryBuilder("user")
.innerJoin("user.photos", "photo")
.where("user.name = :name", { name: "Timber" })
.getOne();
å°ä¼çæå¦ä¸ SQL è¯å¥ï¼
SELECT user.* FROM users user
INNER JOIN photos photo ON photo.user = user.id
WHERE user.name = 'Timber'
è¿å°ä¼è¿å Timber 妿仿 photosï¼ä½æ¯å¹¶ä¸ä¼è¿åä»ç photosã
èæ¥ä»»ä½å®ä½æè¡¨â
ä½ ä¸ä» è½èæ¥å ³ç³»ï¼è¿è½èæ¥ä»»ä½å ¶ä»å®ä½æè¡¨ã
ä¾å¦ï¼
const user = await createQueryBuilder("user")
.leftJoinAndSelect(Photo, "photo", "photo.userId = user.id")
.getMany();
const user = await createQueryBuilder("user")
.leftJoinAndSelect("photos", "photo", "photo.userId = user.id")
.getMany();
èæ¥åæ å°åè½â
å°profilePhotoæ·»å å°Userå®ä½ï¼ä½ å¯ä»¥ä½¿ç¨QueryBuilderå°ä»»ä½æ°æ®æ å°å°è¯¥å±æ§ï¼
export class User {
/// ...
profilePhoto: Photo;
}
const user = await createQueryBuilder("user")
.leftJoinAndMapOne("user.profilePhoto", "user.photos", "photo", "photo.isForProfile = TRUE")
.where("user.name = :name", { name: "Timber" })
.getOne();
è¿å°å è½½ Timber çä¸ªäººèµæç
§çå¹¶å°å
¶è®¾ç½®ä¸ºuser.profilePhotoã
妿è¦å 载并æ å°å个å®ä½ï¼è¯·ä½¿ç¨leftJoinAndMapOneã
妿è¦å è½½åæ å°å¤ä¸ªå®ä½ï¼è¯·ä½¿ç¨leftJoinAndMapManyã
è·åçæçsqlæ¥è¯¢è¯å¥â
ææ¶ä½ å¯è½æ³è¦è·åQueryBuilderçæç SQL æ¥è¯¢ã
为æ¤ï¼è¯·ä½¿ç¨getSqlï¼
const sql = createQueryBuilder("user")
.where("user.firstName = :firstName", { firstName: "Timber" })
.orWhere("user.lastName = :lastName", { lastName: "Saw" })
.getSql();
åºäºè°è¯ç®çï¼ä½ ä¹å¯ä»¥ä½¿ç¨printSqlï¼
const users = await createQueryBuilder("user")
.where("user.firstName = :firstName", { firstName: "Timber" })
.orWhere("user.lastName = :lastName", { lastName: "Saw" })
.printSql()
.getMany();
æ¤æ¥è¯¢å°è¿å users å¹¶å°ä½¿ç¨ç sql è¯å¥æå°å°æ§å¶å°ã
è·å¾åå§ç»æâ
使ç¨éæ©æ¥è¯¢æå»ºå¨å¯ä»¥è·å¾ä¸¤ç§ç±»åçç»æï¼entities å raw resultsã
大夿°æ
åµä¸ï¼ä½ åªéè¦ä»æ°æ®åºä¸éæ©çå®å®ä½ï¼ä¾å¦ usersã
为æ¤ï¼ä½ å¯ä»¥ä½¿ç¨getOneågetManyã
使¯ï¼ææ¶éè¦éæ©ç¹å®æ°æ®ï¼ä¾å¦ sum of all user photosã
è¿äºæ°æ®ä¸æ¯å®ä½ï¼å®è¢«ç§°ä¸ºåå§æ°æ®ã
è¦è·ååå§æ°æ®ï¼è¯·ä½¿ç¨getRawOneågetRawManyã
ä¾å¦ï¼
const { sum } = await getRepository(User)
.createQueryBuilder("user")
.select("SUM(user.photosCount)", "sum")
.where("user.id = :id", { id: 1 })
.getRawOne();
const photosSums = await getRepository(User)
.createQueryBuilder("user")
.select("user.id")
.addSelect("SUM(user.photosCount)", "sum")
.where("user.id = :id", { id: 1 })
.getRawMany();
// ç»æå°ä¼åè¿æ ·: [{ id: 1, sum: 25 }, { id: 2, sum: 13 }, ...]
æµæ°æ®â
ä½ å¯ä»¥ä½¿ç¨streamæ¥è¿åæµã
Streaming è¿ååå§æ°æ®ï¼å¿
é¡»æå¨å¤çå®ä½è½¬æ¢ï¼
const stream = await getRepository(User)
.createQueryBuilder("user")
.where("user.id = :id", { id: 1 })
.stream();
使ç¨å页â
大夿°æ åµä¸ï¼å¨å¼ååºç¨ç¨åºæ¶ï¼ä½ å¯è½éè¦å页åè½ã å¦æä½ çåºç¨ç¨åºä¸æå页ï¼page slider ææ éæ»å¨ç»ä»¶ï¼åä½¿ç¨æ¤é项ã
const users = await getRepository(User)
.createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.take(10)
.getMany();
å°ä¼è¿åå 10 个 user ç photosã
const users = await getRepository(User)
.createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.skip(10)
.getMany();
å°è¿åé¤äºå 10 个 user 以å¤çææ user ç photosã
ä½ å¯ä»¥ç»åè¿äºæ¹æ³ï¼
const users = await getRepository(User)
.createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.skip(5)
.take(10)
.getMany();
è¿å°è·³è¿å 5 个 usersï¼å¹¶è·åä»ä»¬ä¹åç 10 个 userã
takeåskipå¯è½çèµ·æ¥åæä»¬æ£å¨ä½¿ç¨limitåoffsetï¼ä½å®ä»¬ä¸æ¯ã
䏿¦ä½ ææ´å¤æçè¿æ¥æåæ¥è¯¢æ¥è¯¢ï¼limitåoffsetå¯è½æ æ³æ£å¸¸å·¥ä½ã
使ç¨takeåskipå¯ä»¥é²æ¢è¿äºé®é¢ã
å éâ
QueryBuilder æ¯æ optimistic å pessimistic éå®ã è¦ä½¿ç¨ pessimistic 读éå®ï¼è¯·ä½¿ç¨ä»¥ä¸æ¹å¼ï¼
const users = await getRepository(User)
.createQueryBuilder("user")
.setLock("pessimistic_read")
.getMany();
è¦ä½¿ç¨ pessimistic åéå®ï¼è¯·ä½¿ç¨ä»¥ä¸æ¹å¼ï¼
const users = await getRepository(User)
.createQueryBuilder("user")
.setLock("pessimistic_write")
.getMany();
è¦ä½¿ç¨ optimistic 读éå®ï¼è¯·ä½¿ç¨ä»¥ä¸æ¹å¼ï¼
const users = await getRepository(User)
.createQueryBuilder("user")
.setLock("optimistic", existUser.version)
.getMany();
è¦ä½¿ç¨ dirty 读éå®ï¼è¯·ä½¿ç¨ä»¥ä¸æ¹å¼ï¼
const users = await getRepository(User)
.createQueryBuilder("user")
.setLock("dirty_read")
.getMany();
Optimistic éå®ä¸@Versionå@UpdatedDateè£
饰å¨ä¸èµ·ä½¿ç¨ã
æ¥è¯¢é¨ååæ®µâ
å¦æåªæ³éæ©å®ä½çæäºå±æ§ï¼å¯ä»¥ä½¿ç¨ä»¥ä¸è¯æ³ï¼
const users = await getRepository(User)
.createQueryBuilder("user")
.select(["user.id", "user.name"])
.getMany();
è¿åªä¼éæ©Userçidånameã
使ç¨åæ¥è¯¢â
ä½ å¯ä»¥è½»æ¾åå»ºåæ¥è¯¢ã FROMï¼WHEREåJOIN表达å¼é½æ¯æåæ¥è¯¢ã
ä¾å¦ï¼
const qb = await getRepository(Post).createQueryBuilder("post");
const posts = qb
.where(
"post.title IN " +
qb
.subQuery()
.select("user.name")
.from(User, "user")
.where("user.registered = :registered")
.getQuery()
)
.setParameter("registered", true)
.getMany();
ä½¿ç¨æ´ä¼é çæ¹å¼æ¥ååæ ·çäºæ ï¼
const posts = await connection
.getRepository(Post)
.createQueryBuilder("post")
.where(qb => {
const subQuery = qb
.subQuery()
.select("user.name")
.from(User, "user")
.where("user.registered = :registered")
.getQuery();
return "post.title IN " + subQuery;
})
.setParameter("registered", true)
.getMany();
æè ï¼ä½ å¯ä»¥å建åç¬çæ¥è¯¢æå»ºå¨å¹¶ä½¿ç¨å ¶çæç SQLï¼
const userQb = await connection
.getRepository(User)
.createQueryBuilder("user")
.select("user.name")
.where("user.registered = :registered", { registered: true });
const posts = await connection
.getRepository(Post)
.createQueryBuilder("post")
.where("post.title IN (" + userQb.getQuery() + ")")
.setParameters(userQb.getParameters())
.getMany();
ä½ å¯ä»¥å¨FROMä¸åå»ºåæ¥è¯¢ï¼å¦ä¸æç¤ºï¼
const userQb = await connection
.getRepository(User)
.createQueryBuilder("user")
.select("user.name", "name")
.where("user.registered = :registered", { registered: true });
const posts = await connection
.createQueryBuilder()
.select("user.name", "name")
.from("(" + userQb.getQuery() + ")", "user")
.setParameters(userQb.getParameters())
.getRawMany();
æä½¿ç¨æ´ä¼é çè¯æ³ï¼
const posts = await connection
.createQueryBuilder()
.select("user.name", "name")
.from(subQuery => {
return subQuery
.select("user.name", "name")
.from(User, "user")
.where("user.registered = :registered", { registered: true });
}, "user")
.getRawMany();
å¦ææ³æ·»å ä¸ä¸ªåæ¥è¯¢å为"second from"ï¼è¯·ä½¿ç¨addFromã
ä½ ä¹å¯ä»¥å¨SELECTè¯å¥ä¸ä½¿ç¨åæ¥è¯¢ï¼
const posts = await connection
.createQueryBuilder()
.select("post.id", "id")
.addSelect(subQuery => {
return subQuery
.select("user.name", "name")
.from(User, "user")
.limit(1);
}, "name")
.from(Post, "post")
.getRawMany();
éèåâ
å¦æè¦æ¥è¯¢ç模åå
·æ"selectï¼false"çåï¼åå¿
须使ç¨addSelect彿°æ¥ä»å䏿£ç´¢ä¿¡æ¯ã
åè®¾ä½ æä»¥ä¸å®ä½ï¼
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column({ select: false })
password: string;
}
ä½¿ç¨æ åçfindææ¥è¯¢ï¼ä½ å°ä¸ä¼æ¥æ¶å°æ¨¡åçpassword屿§ã 使¯ï¼å¦ææ§è¡ä»¥ä¸æä½ï¼
const users = await connection
.getRepository(User)
.createQueryBuilder()
.select("user.id", "id")
.addSelect("user.password")
.getMany();
ä½ å°å¨æ¥è¯¢ä¸è·å¾å±æ§passwordã