Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Realizar consultas nativas a la base de datos

En esta guía, puedes aprender a utilizar la extensión MongoDB para Hibernate ORM para ejecutar consultas nativas en tu base de datos de MongoDB. En lugar de Hibernate Query Language (HQL) o Jakarta Persistence Query Language (JPQL), las consultas nativas permiten usar MongoDB languaje del query (MQL) para especificar su query. MQL es una sintaxis de query diseñada para interactuar con el modelo basado en documentos de MongoDB.

Tip

MongoDB languaje del query

Para obtener más información sobre la sintaxis y la funcionalidad de MQL, consulte Referencia del languaje del query de MongoDB en el manual del MongoDB Server.

ORM de Hibernate createQuery() el método no admite algunas funcionalidades de query de MongoDB. El método createNativeQuery() te permite especificar consultas de base de datos en MQL y omitir algunas limitaciones operativas de la extensión Hibernate ORM.

También puedes ejecutar consultas directamente en tu objeto MongoClient para una funcionalidad de consulta ampliada.

Los ejemplos de esta guía utilizan la Movie entidad, que representa la sample_mflix.movies colección de los conjuntos de datos de muestra del Atlas. La Movie entidad tiene la siguiente definición:

import com.mongodb.hibernate.annotations.ObjectIdGenerator;
import org.bson.types.ObjectId;
import java.util.List;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
@Table(name = "movies")
public class Movie {
@Id
@ObjectIdGenerator
private ObjectId id;
private String title;
private String plot;
private int year;
private int runtime;
private List<String> cast;
public Movie(String title, String plot, int year, int runtime, List<String> cast) {
this.title = title;
this.plot = plot;
this.year = year;
this.runtime = runtime;
this.cast = cast;
}
public Movie() {
}
public ObjectId getId() {
return id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPlot() {
return plot;
}
public void setPlot(String plot) {
this.plot = plot;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getRuntime() {
return runtime;
}
public void setRuntime(int runtime) {
this.runtime = runtime;
}
public List<String> getCast() {
return cast;
}
public void setCast(List<String> cast) {
this.cast = cast;
}
}

Para aprender a crear una aplicación Java que use la extensión MongoDB para Hibernate ORM para interactuar con esta colección de muestra de MongoDB, consulte Comenzar tutorial.

Nota

Contextos de Persistencia

Para habilitar que Hibernate ORM interactúe con la base de datos, debe ejecutar operaciones dentro de un contexto de persistencia utilizando una Session de Hibernate o una EntityManager de Jakarta Persistence. Los ejemplos de esta guía utilizan un Session. Para obtener más información sobre los contextos de persistencia, consulte la guía Transacciones y sesiones.

Para ejecutar una consulta nativa de MongoDB, especifique una declaración de lenguaje de consulta de MongoDB (MQL) que incluya la colección a consultar y sus criterios de consulta en una canalización de agregación.

Tip

Pipeline de agregación

Para obtener más información sobre cómo construir canales de agregación y ejecutar operaciones de agregación, consulte la referencia de canalización de agregación en el manual de MongoDB Server.

Las instrucciones MQL tienen el siguiente formato:

String mqlSyntax = """
{
aggregate: "<collection to query>",
pipeline: [
<aggregation pipeline stages>
]
}
""";

Importante

$project Requisitos de la etapa

El pipeline de agregación en tu instrucción MQL debe incluir una etapa $project. Para devolver los documentos de query como instancias de entidad, debes especificar cada campo de entidad además del campo de llave primaria en la etapa $project.

Luego, pase la instrucción MQL al método createNativeQuery(). No puedes ejecutar consultas nativas que utilicen valores de parámetros. En su lugar, especifique sus términos de búsqueda dentro de la instrucción MQL.

Puede utilizar consultas nativas para realizar las siguientes operaciones:

Este ejemplo ejecuta una consulta nativa en la colección sample_mflix.movies pasando una instrucción MQL al método createNativeQuery(). El código especifica las siguientes etapas de la canalización de agregación:

  • $matchFiltros para documentos que tienen un valor de campo de título "The Parent Trap"

  • $sort: Ordena los documentos coincidentes por sus campos year en orden descendente

  • $projectDevuelve cada campo de documento definido en la entidad Movie

String nativeQuery = """
{
aggregate: "movies",
pipeline: [
{ $match: { title: { $eq: "The Parent Trap" } } },
{ $sort: { year: -1 } },
{ $project: { title: 1, plot: 1, year: 1, runtime: 1, cast: 1 } }
]
}
""";
var results = session.createNativeQuery(nativeQuery, Movie.class)
.getResultList();
for (Movie movie : results) {
System.out.println("Title: " + movie.getTitle() + ", Year: " + movie.getYear());
}
Title: The Parent Trap, Year: 1998
Title: The Parent Trap, Year: 1961

La extensión Hibernate ORM no admite actualmente instrucciones de HQL o JPQL que utilicen operadores aritméticos. Sin embargo, puedes realizar operaciones aritméticas en tus datos utilizando los operadores aritméticos de MongoDB en una instrucción MQL.

Tip

Operadores aritméticos

Para obtener más información sobre los operadores aritméticos de Hibernate y MongoDB, consulte los siguientes recursos:

El siguiente ejemplo ejecuta una query nativa en la colección sample_mflix.movies que realiza las siguientes acciones:

  • Especifica una etapa $match para hacer coincidir los documentos que tienen un valor year mayor que 2000 y un campo runtime que existe

  • Especifica una etapa $addFields para agregar un nuevo campo llamado runtimeHours

  • Utiliza el operador aritmético $divide para convertir el valor runtime de minutos a horas para el nuevo campo runtimeHours

  • Especifica una etapa $project para devolver cada campo de documento definido en la entidad Movie, excepto el campo llave primaria

  • Imprime el valor title de cada documento actualizado

String nativeQuery = """
{
aggregate: "movies",
pipeline: [
{ $match: { year: { $gt: 2000 }, runtime: { $exists: true } } },
{ $addFields: {
runtimeHours: { $divide: [ "$runtime", 60 ] }
}},
{ $project: {
title: 1,
plot: 1,
year: 1,
runtime: 1,
cast: 1,
runtimeHours: 1
}}
]
}
""";
var results = session.createNativeQuery(nativeQuery, Movie.class)
.getResultList();
for (Movie result : results) {
System.out.println("Added field to movie: " + result.getTitle());
}
Added field to movie: Kate & Leopold
Added field to movie: Crime and Punishment
Added field to movie: Glitter
Added field to movie: The Manson Family
Added field to movie: The Dancer Upstairs
Added field to movie: Fantastic Four
...

Puedes ejecutar queries nativas para realizar queries de búsqueda de MongoDB en tu base de datos, que son búsquedas de texto detalladas en tus datos. Estas consultas proporcionan funcionalidades avanzadas de búsqueda, tales como la coincidencia de frases de texto, la puntuación de resultados por relevancia y el resaltado de coincidencias.

Importante

No puedes ejecutar una consulta MongoDB Search dentro de una transacción.

Para especificar una consulta de búsqueda, crea un índice de búsqueda que abarque los campos que deseas consultar. Luego, pasa un pipeline de agregación a tu método createNativeQuery() que incluya una etapa $search o $searchMeta.

Tip

MongoDB búsqueda

Para obtener más información sobre las consultas e índices de búsqueda de MongoDB, consulte Descripción general de búsqueda de MongoDB en el manual del servidor MongoDB.

Este ejemplo ejecuta una consulta de búsqueda pasando la etapa de pipeline $search al método createNativeQuery(). El código realiza las siguientes acciones:

  • Especifica el índice de búsqueda que abarca el campo plot. Asegúrate de reemplazar el marcador de posición <indexName> por el nombre de tu índice de búsqueda.

  • Queries para documentos cuyos valores de plot contienen la string "whirlwind romance" con no más de 3 palabras entre ellos

  • Especifica una etapa $project para devolver cada campo de documento definido en la entidad Movie, excepto el campo llave primaria

  • Imprime los valores title y plot de los documentos coincidentes

String nativeQuery = """
{
aggregate: "movies",
pipeline: [
{
$search: {
index: "<indexName>",
phrase: {
path: "plot",
query: "whirlwind romance",
slop: 3
}
}
},
{
$project: {
title: 1,
plot: 1,
year: 1,
runtime: 1,
cast: 1
}
}
]
}
""";
var results = session.createNativeQuery(nativeQuery, Movie.class)
.getResultList();
for (Movie result : results) {
System.out.println("Title: " + result.getTitle() + ", Plot: " + result.getPlot());
}
Title: Tokyo Fiancèe, Plot: A young Japanophile Belgian woman in Tokyo falls into a whirlwind romance with a Francophile Japanese student.
Title: Designing Woman, Plot: A sportswriter and a fashion-designer marry after a whirlwind romance, and discover they have little in common.
Title: Vivacious Lady, Plot: On a quick trip to the city, young university professor Peter Morgan falls in love with nightclub performer Francey Brent and marries her after a whirlwind romance. But when he goes back ...
Title: Ek Hasina Thi, Plot: A woman falls for a charming and mysterious businessman. The whirlwind romance turns sour when she is framed for his underworld crimes. Now, finally out of prison she is ready for sweet revenge.
Title: Kick, Plot: An adrenaline junkie walks away from a whirlwind romance and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster.
Title: A Tale of Winter, Plot: Felicie and Charles have a serious if whirlwind holiday romance. Due to a mix-up on addresses they lose contact, and five years later at Christmas-time Felicie is living with her mother in ...

Si quieres ejecutar operaciones de base de datos que no sean compatibles ni con el método createQuery() ni con el método createNativeQuery(), puedes operar directamente sobre un objeto MongoClient en tu aplicación Java. Al trabajar con MongoClient, puedes acceder a la funcionalidad del MongoDB Java Sync Driver.

Tip

Característica Soporte

Para obtener más información sobre las funcionalidades no compatibles de MongoDB a las que debes acceder utilizando un objeto MongoClient, consulta la página Compatibilidad de funcionalidad.

Para aprender a usar el controlador Java para interactuar con MongoDB, revise la documentación del controlador Java de MongoDB.

No se puede usar la extensión Hibernate ORM para crear índices en una colección, pero se puede instanciar un MongoClient y usar el método createIndex() del driver de Java. El siguiente código crea un índice de campo title en la colección sample_mflix.movies:

// Replace the <connection URI> placeholder with your MongoDB connection URI
String uri = "<connection URI>";
MongoClient mongoClient = MongoClients.create(uri);
MongoDatabase db = mongoClient.getDatabase("sample_mflix");
MongoCollection<Document> collection = db.getCollection("movies");
String indexResult = collection.createIndex(Indexes.ascending("title"));
System.out.println(String.format("Index created: %s", indexResult));
Index created: title_1

Para obtener más información sobre cómo utilizar el driver de Java para crear índices, consulta la guía Índices en la documentación del driver de Java.

Para aprender más sobre los languajes de los query tratados en esta guía, consulte los siguientes recursos:

Volver

Especifica un query

En esta página