Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
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 saber más sobre la sintaxis y la funcionalidad MQL, consulta Referencia del languaje del query de MongoDB en el manual del MongoDB Server.

de Hibernate ORM 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 entidad Movie, que representa la colección sample_mflix.movies del conjuntos de datos de muestras de Atlas. La entidad Movie 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 interactuar con esta colección de ejemplo de MongoDB, consulte la 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 un query nativo de MongoDB, especifica una instrucción del languaje del query de MongoDB (MQL) que incluya la colección a consultar y tus criterios de query en un pipeline de agregación.

Tip

Pipeline de agregación

Para obtener más información sobre cómo construir pipelines de agregación y ejecutar operaciones de agregación, consulta la referencia sobre pipeline 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.

Puedes 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 del pipeline 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, consulta 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 MongoDB Search, consulte Descripción general de MongoDB Search en el manual del servidor de 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 de 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

Compatibilidad de funcionalidad

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