Opciones de Búsqueda
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
Opciones básicas
Todos los métodos .find* del repositorio y del administrador aceptan opciones especiales que puedes usar para consultar los datos que necesitas sin utilizar QueryBuilder:
select- indica qué propiedades del objeto principal deben seleccionarse
userRepository.find({
select: {
firstName: true,
lastName: true,
},
})
ejecutará la siguiente consulta:
SELECT "firstName", "lastName" FROM "user"
relations- relaciones que deben cargarse con la entidad principal. También se pueden cargar sub-relaciones (abreviatura dejoinyleftJoinAndSelect)
userRepository.find({
relations: {
profile: true,
photos: true,
videos: true,
},
})
userRepository.find({
relations: {
profile: true,
photos: true,
videos: {
videoAttributes: true,
},
},
})
ejecutará las siguientes consultas:
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- condiciones simples por las que se debe consultar la entidad.
userRepository.find({
where: {
firstName: "Timber",
lastName: "Saw",
},
})
ejecutará la siguiente consulta:
SELECT * FROM "user"
WHERE "firstName" = 'Timber' AND "lastName" = 'Saw'
Consultar una columna de una entidad embebida debe hacerse respetando la jerarquía en la que fue definida. Ejemplo:
userRepository.find({
relations: {
project: true,
},
where: {
project: {
name: "TypeORM",
initials: "TORM",
},
},
})
ejecutará la siguiente consulta:
SELECT * FROM "user"
LEFT JOIN "project" ON "project"."id" = "user"."projectId"
WHERE "project"."name" = 'TypeORM' AND "project"."initials" = 'TORM'
Consultas con operador OR:
userRepository.find({
where: [
{ firstName: "Timber", lastName: "Saw" },
{ firstName: "Stan", lastName: "Lee" },
],
})
ejecutará la siguiente consulta:
SELECT * FROM "user" WHERE ("firstName" = 'Timber' AND "lastName" = 'Saw') OR ("firstName" = 'Stan' AND "lastName" = 'Lee')
order- orden de selección.
userRepository.find({
order: {
name: "ASC",
id: "DESC",
},
})
ejecutará la siguiente consulta:
SELECT * FROM "user"
ORDER BY "name" ASC, "id" DESC
withDeleted- incluye entidades eliminadas suavemente consoftDeleteosoftRemove(por ejemplo, que tengan su columna@DeleteDateColumnestablecida). Por defecto, las entidades eliminadas suavemente no se incluyen.
userRepository.find({
withDeleted: true,
})
Los métodos find* que devuelven múltiples entidades (find, findBy, findAndCount, findAndCountBy) también aceptan estas opciones:
skip- desplazamiento (paginado) desde donde deben tomarse las entidades.
userRepository.find({
skip: 5,
})
SELECT * FROM "user"
OFFSET 5
take- límite (paginado) - número máximo de entidades que deben tomarse.
userRepository.find({
take: 10,
})
ejecutará la siguiente consulta:
SELECT * FROM "user"
LIMIT 10
** skip y take deben usarse conjuntamente
** Si usas TypeORM con MSSQL y quieres utilizar take o limit, debes incluir order o recibirás el error: 'Invalid usage of the option NEXT in the FETCH statement.'
userRepository.find({
order: {
columnName: "ASC",
},
skip: 0,
take: 10,
})
ejecutará la siguiente consulta:
SELECT * FROM "user"
ORDER BY "columnName" ASC
LIMIT 10 OFFSET 0
cache- Habilita o deshabilita el caché de resultados de consultas. Ver caching para más información y opciones.
userRepository.find({
cache: true,
})
lock- Habilita mecanismo de bloqueo para consultas. Solo puede usarse en métodosfindOneyfindOneBy.lockes un objeto que puede definirse como:
{ mode: "optimistic", version: number | Date }
o
{
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"
}
por ejemplo:
userRepository.findOne({
where: {
id: 1,
},
lock: { mode: "optimistic", version: 1 },
})
Consulta lock modes para más información
Ejemplo completo de opciones de búsqueda:
userRepository.find({
select: {
firstName: true,
lastName: true,
},
relations: {
profile: true,
photos: true,
videos: true,
},
where: {
firstName: "Timber",
lastName: "Saw",
profile: {
userName: "tshaw",
},
},
order: {
name: "ASC",
id: "DESC",
},
skip: 5,
take: 10,
cache: true,
})
Búsqueda sin argumentos:
userRepository.find()
ejecutará la siguiente consulta:
SELECT * FROM "user"
Opciones avanzadas
TypeORM proporciona numerosos operadores integrados para crear comparaciones más complejas:
Not(Negación lógica)
import { Not } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
title: Not("About #1"),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "title" != 'About #1'
LessThan(Menor que)
import { LessThan } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
likes: LessThan(10),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "likes" < 10
LessThanOrEqual(Menor o igual que)
import { LessThanOrEqual } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
likes: LessThanOrEqual(10),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "likes" <= 10
MoreThan(Mayor que)
import { MoreThan } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
likes: MoreThan(10),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "likes" > 10
MoreThanOrEqual(Mayor o igual que)
import { MoreThanOrEqual } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
likes: MoreThanOrEqual(10),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "likes" >= 10
Equal(Igual a)
import { Equal } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
title: Equal("About #2"),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "title" = 'About #2'
Like(Coincidencia de patrón)
import { Like } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
title: Like("%out #%"),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "title" LIKE '%out #%'
ILike(Coincidencia de patrón insensible a mayúsculas/minúsculas)
import { ILike } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
title: ILike("%out #%"),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "title" ILIKE '%out #%'
Between(Entre valores)
import { Between } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
likes: Between(1, 10),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "likes" BETWEEN 1 AND 10
In(En conjunto de valores)
import { In } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
title: In(["About #2", "About #3"]),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "title" IN ('About #2','About #3')
Any(Cumple alguna condición en array)
import { Any } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
title: Any(["About #2", "About #3"]),
})
ejecutará la siguiente consulta (notación de Postgres):
SELECT * FROM "post" WHERE "title" = ANY(['About #2','About #3'])
IsNull(Es nulo)
import { IsNull } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
title: IsNull(),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "title" IS NULL
ArrayContains(Array contiene elemento)
import { ArrayContains } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
categories: ArrayContains(["TypeScript"]),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "categories" @> '{TypeScript}'
ArrayContainedBy(Array está contenido por)
import { ArrayContainedBy } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
categories: ArrayContainedBy(["TypeScript"]),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "categories" <@ '{TypeScript}'
ArrayOverlap(Arrays se superponen)
import { ArrayOverlap } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
categories: ArrayOverlap(["TypeScript"]),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "categories" && '{TypeScript}'
JsonContains(solo para PostgreSQL/CockroachDB)
import { JsonContains } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
metadata: JsonContains({ author: { name: "John" } }),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "metadata" ::jsonb @> '{"author":{"name":"John"}}'
Raw(Expresión SQL en bruto)
import { Raw } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
likes: Raw("dislikes - 4"),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "likes" = "dislikes" - 4
En el caso más simple, una consulta en bruto se inserta inmediatamente después del símbolo de igual. Pero también puedes reescribir completamente la lógica de comparación usando la función.
import { Raw } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
currentDate: Raw((alias) => `${alias} > NOW()`),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "currentDate" > NOW()
Si necesitas proporcionar datos de usuario, no debes incluirlos directamente en tu consulta ya que esto podría crear una vulnerabilidad de inyección SQL. En su lugar, puedes usar el segundo argumento de la función Raw para proporcionar una lista de parámetros que se vincularán a la consulta.
import { Raw } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
currentDate: Raw((alias) => `${alias} > :date`, { date: "2020-10-06" }),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "currentDate" > '2020-10-06'
Si necesitas proporcionar datos de usuario que sean un array, puedes vincularlos como una lista de valores en la sentencia SQL usando la sintaxis de expresión especial:
import { Raw } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
title: Raw((alias) => `${alias} IN (:...titles)`, {
titles: [
"Go To Statement Considered Harmful",
"Structured Programming",
],
}),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "title" IN ('Go To Statement Considered Harmful', 'Structured Programming')
Combinando opciones avanzadas
También puedes combinar estos operadores con los siguientes:
Not(Negación lógica)
import { Not, MoreThan, Equal } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
likes: Not(MoreThan(10)),
title: Not(Equal("About #2")),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE NOT("likes" > 10) AND NOT("title" = 'About #2')
Or(Operador OR)
import { Or, Equal, ILike } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
title: Or(Equal("About #2"), ILike("About%")),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE "title" = 'About #2' OR "title" ILIKE 'About%'
And(Operador AND)
import { And, Not, Equal, ILike } from "typeorm"
const loadedPosts = await dataSource.getRepository(Post).findBy({
title: And(Not(Equal("About #2")), ILike("%About%")),
})
ejecutará la siguiente consulta:
SELECT * FROM "post" WHERE NOT("title" = 'About #2') AND "title" ILIKE '%About%'