SELECT * FROM "user"
LEFT JOIN "profile" ON "profile"."id" = "user"."profileId"
LEFT JOIN "photos" ON "photos"."id" = "user"."photoId"
LEFT JOIN "videos" ON "videos"."id" = "user"."videoId"
SELECT * FROM "user"
LEFT JOIN "profile" ON "profile"."id" = "user"."profileId"
LEFT JOIN "photos" ON "photos"."id" = "user"."photoId"
LEFT JOIN "videos" ON "videos"."id" = "user"."videoId"
LEFT JOIN "video_attributes" ON "video_attributes"."id" = "videos"."video_attributesId"
where - simple conditions by which entity should be queried.
SELECT * FROM "user"
ORDER BY "name" ASC, "id" DESC
withDeleted - include entities which have been soft deleted with softDelete or softRemove, e.g. have their @DeleteDateColumn column set. By default, soft deleted entities are not included.
userRepository.find({
withDeleted: true,
})
find* methods which return multiple entities (find, findBy, findAndCount, findAndCountBy) also accept following options:
skip - offset (paginated) from where entities should be taken.
userRepository.find({
skip: 5,
})
SELECT * FROM "user"
OFFSET 5
take - limit (paginated) - max number of entities that should be taken.
userRepository.find({
take: 10,
})
will execute following query:
SELECT * FROM "user"
LIMIT 10
** skip and take should be used together
** If you are using typeorm with MSSQL, and want to use take or limit, you need to use order as well or you will receive the following error: 'Invalid usage of the option NEXT in the FETCH statement.'
SELECT * FROM "user"
ORDER BY "columnName" ASC
LIMIT 10 OFFSET 0
cache - Enables or disables query result caching. See caching for more information and options.
userRepository.find({
cache: true,
})
lock - Enables locking mechanism for query. Can be used only in findOne and findOneBy methods. lock is an object which can be defined as:
{ mode: "optimistic", version: number | Date }
or
{
mode: "pessimistic_read" |
"pessimistic_write" |
"dirty_read" |
/*
"pessimistic_partial_write" and "pessimistic_write_or_fail" are deprecated and
will be removed in a future version.
Use onLocked instead.
*/
"pessimistic_partial_write" |
"pessimistic_write_or_fail" |
"for_no_key_update" |
"for_key_share",
tables: string[],
onLocked: "nowait" | "skip_locked"
}
SELECT * FROM "post" WHERE "categories" && '{TypeScript}'
Raw
import { Raw } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
likes: Raw("dislikes - 4"),
})
will execute following query:
SELECT * FROM "post" WHERE "likes" = "dislikes" - 4
In the simplest case, a raw query is inserted immediately after the equal symbol. But you can also completely rewrite the comparison logic using the function.
import { Raw } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
currentDate: Raw((alias) => `${alias} > NOW()`),
})
will execute following query:
SELECT * FROM "post" WHERE "currentDate" > NOW()
If you need to provide user input, you should not include the user input directly in your query as this may create a SQL injection vulnerability. Instead, you can use the second argument of the Raw function to provide a list of parameters to bind to the query.