Overview
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.
Datos de muestra
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; public class Movie { 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.
Ejecuta consultas nativas
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
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:
Filtrar y organizar campos del documento
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 camposyearen orden descendente$projectDevuelve cada campo de documento definido en la entidadMovie
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
Usa operadores aritméticos
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:
Aritmética numérica en la guía de query de Hibernate ORM
Operadores aritméticos en el manual de MongoDB Server
El siguiente ejemplo ejecuta una query nativa en la colección sample_mflix.movies que realiza las siguientes acciones:
Especifica una etapa
$matchpara hacer coincidir los documentos que tienen un valoryearmayor que2000y un camporuntimeque existeEspecifica una etapa
$addFieldspara agregar un nuevo campo llamadoruntimeHoursUtiliza el operador aritmético
$dividepara convertir el valorruntimede minutos a horas para el nuevo camporuntimeHoursEspecifica una etapa
$projectpara devolver cada campo de documento definido en la entidadMovie, excepto el campo llave primariaImprime el valor
titlede 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 ...
Ejecuta una MongoDB Search query
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
plotcontienen la string"whirlwind romance"con no más de3palabras entre ellosEspecifica una etapa
$projectpara devolver cada campo de documento definido en la entidadMovie, excepto el campo llave primariaImprime los valores
titleyplotde 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 ...
Ejecutar operaciones de MongoClient
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.
Crear índices con el MongoClient
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.
Información Adicional
Para aprender más sobre los languajes de los query tratados en esta guía, consulte los siguientes recursos:
Una guía rápida del languaje del query de Hibernate en la documentación de Hibernate ORM
Referencia del lenguaje de consulta de MongoDB en el manual del servidor MongoDB