Overview
En esta guía, aprenderá a llamar a las funciones de cadena del lenguaje de consulta de Hibernate (HQL) en un campo de cadena utilizando la extensión MongoDB para Hibernate ORM. Las funciones de cadena permiten medir, reformatear y combinar valores de cadena como parte de una consulta.
Puedes llamar a cada función en una cláusula SELECT. La extensión Hibernate ORM traduce cada llamada a función a una expresión de agregación de MongoDB en la etapa $project. Dado que la extensión Hibernate ORM no admite llamadas a funciones como operandos de una expresión calculada, no puedes combinar una función de cadena con un operador aritmético.
La extensión Hibernate ORM admite las siguientes funciones de cadena:
Función | Traducción de MongoDB |
|---|---|
| |
| |
| |
| |
| |
| |
| |
| $trim, $ltrim o $rtrim, dependiendo de la dirección de recorte especificada. |
| Calculado a partir de $strLenCP, $substrCP y $concat |
|
Nota
Funciones de cadena no compatibles
La extensión Hibernate ORM no admite las funciones de cadena HQL position(), overlay(), left(), right() y collate(). Una consulta que llame a una de estas funciones generará una excepción FeatureNotSupportedException.
Para usar una función de cadena no compatible, llame al método createNativeQuery() e incluya el operador correspondiente en su instrucción del lenguaje de consulta de MongoDB. Para obtener más información, consulte la guía "Realizar consultas nativas de la base de datos".
Datos de muestra
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.time.Instant; import java.util.List; import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.Id; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; public class Movie { private ObjectId id; private String title; private String plot; private int year; private List<String> cast; private List<String> directors; private Instant released; private Awards awards; private List<Comment> comments; public Movie(String title, String plot, int year, List<String> cast, List<String> directors, Instant released, Awards awards) { this.title = title; this.plot = plot; this.year = year; this.cast = cast; this.directors = directors; this.released = released; this.awards = awards; } 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 List<String> getCast() { return cast; } public void setCast(List<String> cast) { this.cast = cast; } public List<String> getDirectors() { return directors; } public void setDirectors(List<String> directors) { this.directors = directors; } public Awards getAwards() { return awards; } public void setAwards(Awards awards) { this.awards = awards; } public Instant getReleased() { return released; } public void setReleased(Instant released) { this.released = released; } public List<Comment> getComments() { return comments; } public void setComments(List<Comment> comments) { this.comments = comments; } }
Para aprender a crear una aplicación Java que utilice la extensión MongoDB para Hibernate ORM para interactuar con esta colección de muestra de MongoDB, consulta el tutorial Primeros pasos.
Los ejemplos de esta guía utilizan el campo title de la entidad Movie, que almacena un valor String.
Medir la longitud de una cuerda
La función length(str) devuelve el número de caracteres de una cadena. También se puede llamar a esta función como character_length(str) o char_length(str), que son alias de la misma función. Dado que la extensión ORM de Hibernate traduce la llamada al operador $strLenCP, la función cuenta puntos de código Unicode en lugar de bytes.
El siguiente ejemplo devuelve el título de la película "The Hunger Games" en la colección sample_mflix.movies y la longitud del título:
var lengthResult = session.createQuery( "select title, length(title) as titleLength from Movie where title = :title", Object[].class) .setParameter("title", "The Hunger Games") .getResultList(); for (var row : lengthResult) { System.out.println("Title: " + row[0] + ", Length: " + row[1]); }
var lengthResult = entityManager.createQuery( "select m.title, length(m.title) as titleLength from Movie m where m.title = :title", Object[].class) .setParameter("title", "The Hunger Games") .getResultList(); for (var row : lengthResult) { System.out.println("Title: " + row[0] + ", Length: " + row[1]); }
La extensión Hibernate ORM traduce la consulta anterior a la siguiente etapa $project:
{ "$project": { "title": true, "titleLength": { "$strLenCP": "$title" }, "_id": 0 } }
Cambiar mayúsculas/minúsculas de una cadena
Las funciones upper(str) y lower(str) convierten una cadena a mayúsculas o minúsculas.
El siguiente ejemplo devuelve el título de la película "The Hunger Games" en mayúsculas:
var upperResult = session.createQuery( "select upper(title) as upperTitle from Movie where title = :title", String.class) .setParameter("title", "The Hunger Games") .getResultList(); for (var upperTitle : upperResult) { System.out.println("Uppercase Title: " + upperTitle); }
var upperResult = entityManager.createQuery( "select upper(m.title) as upperTitle from Movie m where m.title = :title", String.class) .setParameter("title", "The Hunger Games") .getResultList(); for (var upperTitle : upperResult) { System.out.println("Uppercase Title: " + upperTitle); }
La extensión Hibernate ORM traduce la consulta anterior a la siguiente etapa $project:
{ "$project": { "upperTitle": { "$toUpper": "$title" }, "_id": 0 } }
Concatenar cadenas
La función concat(x, y) combina dos o más valores en una sola cadena. La extensión ORM de Hibernate convierte cada operando a una cadena antes de la combinación, lo que permite concatenar valores numéricos o un valor numérico a una cadena.
El siguiente ejemplo añade un signo de exclamación al título de la película "The Hunger Games":
var concatResult = session.createQuery( "select concat(title, '!') as excitedTitle from Movie where title = :title", String.class) .setParameter("title", "The Hunger Games") .getResultList(); for (var excitedTitle : concatResult) { System.out.println("Concatenated Title: " + excitedTitle); }
var concatResult = entityManager.createQuery( "select concat(m.title, '!') as excitedTitle from Movie m where m.title = :title", String.class) .setParameter("title", "The Hunger Games") .getResultList(); for (var excitedTitle : concatResult) { System.out.println("Concatenated Title: " + excitedTitle); }
Tip
También puedes usar el operador de doble barra vertical (||) para unir dos valores. La siguiente consulta es equivalente al ejemplo anterior:
"select title || '!' as excitedTitle from Movie where title = :title"
La extensión Hibernate ORM traduce la consulta anterior a la siguiente etapa $project:
{ "$project": { "excitedTitle": { "$concat": [ { "$toString": "$title" }, { "$toString": "!" } ] }, "_id": 0 } }
Extraer una subcadena
La función substring(str, start) devuelve la parte de una cadena que comienza en la posición start. La posición start se basa en uno, por lo que el primer carácter de la cadena se encuentra en la posición 1. Para limitar el resultado a un número fijo de caracteres, llame a la función como substring(str, start, length).
Si se pasa una posición start de 0 o un valor negativo, la extensión ORM de Hibernate lee desde el principio de la cadena. Si además se pasa una posición length, la extensión resta los caracteres anteriores a la primera posición de la longitud devuelta. Por ejemplo, substring(str, -1, 3) devuelve un carácter y substring(str, 0, 3) devuelve dos.
El siguiente ejemplo devuelve los primeros seis caracteres del título de la película "The Hunger Games":
var substringResult = session.createQuery( "select substring(title, 1, 6) as titlePrefix from Movie where title = :title", String.class) .setParameter("title", "The Hunger Games") .getResultList(); for (var titlePrefix : substringResult) { System.out.println("Title Prefix: " + titlePrefix); }
var substringResult = entityManager.createQuery( "select substring(m.title, 1, 6) as titlePrefix from Movie m where m.title = :title", String.class) .setParameter("title", "The Hunger Games") .getResultList(); for (var titlePrefix : substringResult) { System.out.println("Title Prefix: " + titlePrefix); }
Localizar una subcadena
La función locate(pattern, str) devuelve la posición basada en uno de la primera aparición de pattern en la cadena, o 0 si la cadena no contiene el patrón.
Para iniciar la búsqueda en una posición específica, llame a la función como locate(pattern, str, start). Dado que la posición start se basa en uno, el primer carácter de la cadena se encuentra en la posición 1. Un valor start igual a 0 o un número negativo inicia la búsqueda en la posición 1.
El siguiente ejemplo devuelve la posición de la subcadena "Hunger" en el título de la película "The Hunger Games":
var locateResult = session.createQuery( "select locate('Hunger', title) as position from Movie where title = :title", Integer.class) .setParameter("title", "The Hunger Games") .getResultList(); for (var position : locateResult) { System.out.println("Position: " + position); }
var locateResult = entityManager.createQuery( "select locate('Hunger', m.title) as position from Movie m where m.title = :title", Integer.class) .setParameter("title", "The Hunger Games") .getResultList(); for (var position : locateResult) { System.out.println("Position: " + position); }
Reemplazar una subcadena
La función replace(str, pattern, replacement) reemplaza cada aparición de pattern en la cadena con replacement. La extensión Hibernate ORM traduce la llamada al operador $replaceAll. Los tres argumentos deben ser cadenas.
El siguiente ejemplo reemplaza la subcadena "Hunger" con "Video" en el título de la película "The Hunger Games":
var replaceResult = session.createQuery( "select replace(title, 'Hunger', 'Video') as newTitle from Movie where title = :title", String.class) .setParameter("title", "The Hunger Games") .getResultList(); for (var newTitle : replaceResult) { System.out.println("New Title: " + newTitle); }
var replaceResult = entityManager.createQuery( "select replace(m.title, 'Hunger', 'Video') as newTitle from Movie m where m.title = :title", String.class) .setParameter("title", "The Hunger Games") .getResultList(); for (var newTitle : replaceResult) { System.out.println("New Title: " + newTitle); }
Eliminar caracteres de una cadena
La función trim(str) elimina los espacios iniciales y finales de una cadena. Para eliminar caracteres solo de un extremo de la cadena, utilice trim(leading char from str) o trim(trailing char from str). Para eliminar un carácter distinto de un espacio de ambos extremos de la cadena, especifíquelo mediante las palabras clave both y from, como en trim(both char from str).
El siguiente ejemplo elimina el carácter inicial "T" del título de la película "The Hunger Games":
var trimResult = session.createQuery( "select trim(leading 'T' from title) as trimmedTitle from Movie where title = :title", String.class) .setParameter("title", "The Hunger Games") .getResultList(); for (var trimmedTitle : trimResult) { System.out.println("Trimmed Title: " + trimmedTitle); }
var trimResult = entityManager.createQuery( "select trim(leading 'T' from m.title) as trimmedTitle from Movie m where m.title = :title", String.class) .setParameter("title", "The Hunger Games") .getResultList(); for (var trimmedTitle : trimResult) { System.out.println("Trimmed Title: " + trimmedTitle); }
La extensión Hibernate ORM traduce la consulta anterior a la siguiente etapa $project:
{ "$project": { "trimmedTitle": { "$ltrim": { "chars": "T", "input": "$title" } }, "_id": 0 } }
Rellenar una cuerda
Las funciones pad(str with length leading) y pad(str with length trailing) extienden una cadena hasta el carácter length especificado, añadiendo espacios al principio o al final de la cadena str. Para usar un carácter distinto de un espacio, especifique el carácter después de la dirección, como en pad(str with 20 leading char).
También puedes llamar a las funciones lpad(str, length, padding) y rpad(str, length, padding), que rellenan una cadena con un valor que puede contener más de un carácter. La extensión Hibernate ORM repite el valor de relleno tantas veces como sea necesario y lo trunca para alcanzar la longitud deseada. Por ejemplo, lpad('x', 6, 'ab') devuelve "ababax".
El relleno se comporta de la siguiente manera en estos casos:
Si la longitud de destino es menor que la cadena, la extensión ORM de Hibernate trunca la cadena a la longitud de destino eliminando los caracteres finales que se encuentran después de dicha longitud.
Si la longitud objetivo es negativa, la función devuelve una cadena vacía.
Si el valor de relleno es una cadena vacía, la función devuelve la cadena original.
El siguiente ejemplo utiliza asteriscos iniciales para completar el título de la película "The Hunger Games" hasta alcanzar los 20 caracteres:
var padResult = session.createQuery( "select pad(title with 20 leading '*') as paddedTitle from Movie where title = :title", String.class) .setParameter("title", "The Hunger Games") .getResultList(); for (var paddedTitle : padResult) { System.out.println("Padded Title: " + paddedTitle); }
var padResult = entityManager.createQuery( "select pad(m.title with 20 leading '*') as paddedTitle from Movie m where m.title = :title", String.class) .setParameter("title", "The Hunger Games") .getResultList(); for (var paddedTitle : padResult) { System.out.println("Padded Title: " + paddedTitle); }
Repetir una cadena
La función repeat(str, count) devuelve una cadena que contiene count copias de str.
El siguiente ejemplo devuelve el título de la película "The Hunger Games", repetido dos veces:
var repeatResult = session.createQuery( "select repeat(title, 2) as repeatedTitle from Movie where title = :title", String.class) .setParameter("title", "The Hunger Games") .getResultList(); for (var repeatedTitle : repeatResult) { System.out.println("Repeated Title: " + repeatedTitle); }
var repeatResult = entityManager.createQuery( "select repeat(m.title, 2) as repeatedTitle from Movie m where m.title = :title", String.class) .setParameter("title", "The Hunger Games") .getResultList(); for (var repeatedTitle : repeatResult) { System.out.println("Repeated Title: " + repeatedTitle); }
Información Adicional
Para obtener más información sobre cómo crear filtros de consulta y utilizar operadores en sus sentencias de consulta, consulte la guía Especificar una consulta.
Para aprender a llamar a funciones de fecha y hora en una consulta, consulte la guía "Uso de funciones de fecha y hora en consultas".
Para aprender más sobre el uso de HQL y JPQL para ejecutar queries, consulte Una guía sobre el languaje del query de Hibernate en la documentación de Hibernate ORM.