Overview
このガイドでは、非表示 ORM 用のMongoDB拡張機能 を使用して、文字列フィールドで非表示クエリ言語(HQL)文字列関数を呼び出す方法を学習できます。 string 関数を使用すると、クエリの一部として string 値を測定、再フォーマット、結合できます。
SELECT 句で各関数を呼び出すことができます。 Hibernetes ORM 拡張機能は、各関数呼び出しを $project ステージのMongoDB集計式に変換します。 Hibernetes ORM 拡張機能では、 計算式のオペランドとして関数呼び出しをサポートしていないため、string 関数と算術演算子を組み合わせることはできません。
Hibernetes ORM 拡張機能は次の string 関数をサポートしています。
関数 | MongoDB の変換 |
|---|---|
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
注意
サポートされていない String 関数
Hibernetes ORM 拡張機能は、HQL position()、overlay()、left()、right()、および collate()string 関数をサポートしていません。これらの関数のいずれかを呼び出すクエリでは、FeatureNotSupportedException がスローされます。
サポートされていない string 関数を使用するには、createNativeQuery() メソッドを呼び出し、関連する演算子をMongoDB問い合わせ言語のステートメントに含めます。詳細については、「 ネイティブデータベースクエリの実行 」ガイドを参照してください。
サンプル データ
このガイドの例では、Atlasサンプルデータセットの sample_mflix.moviesコレクションを表す Movie エンティティを使用します。Movie エンティティには次の定義があります。
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; } }
Hibernetes ORM 用のMongoDB拡張機能を使用してこのMongoDBサンプルコレクションと交流するJavaアプリケーションを作成する方法については、Get Started チュートリアルを参照してください。
このガイドの例では、String 値を保存する Movie エンティティの titleフィールドを使用します。
文字列の長さの測定
length(str)関数は、string 内の文字数を返します。この関数は、同じ関数のエイリアスであるcharacter_length(str) またはchar_length(str) として呼び出すこともできます。 Hibernetes ORM 拡張機能は $strLenCP 演算子への呼び出しを変換するため、この関数はバイトではなく Unicode コード ポイントをカウントします。
次の例では、 sample_mflix.moviesコレクション内の "The Hunger Games" 映画のタイトルと、タイトルの長さを返します。
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]); }
Hibernetes ORM 拡張機能は、前述のクエリを次の $project ステージに変換します。
{ "$project": { "title": true, "titleLength": { "$strLenCP": "$title" }, "_id": 0 } }
string の大文字と小文字の変更
upper(str) 関数と lower(str) 関数は、string を大文字または小文字に変換します。
次の例では、"The Hunger Games"映画のタイトルを大文字で返します。
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); }
Hibernetes ORM 拡張機能は、前述のクエリを次の $project ステージに変換します。
{ "$project": { "upperTitle": { "$toUpper": "$title" }, "_id": 0 } }
string の連結
concat(x, y) 関数は、2 つ以上の値を 1 つの文字列に結合します。 Hibernetes ORM 拡張機能は、結合前に各オペランドを string に変換するため、数値を連結したり、数値を string 値に連結したりできます。
次の例では、 "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
二重パイプ演算子(||)を使用して 2 つの値を結合することもできます。次のクエリは、前の例と同等です。
"select title || '!' as excitedTitle from Movie where title = :title"
Hibernetes ORM 拡張機能は、前述のクエリを次の $project ステージに変換します。
{ "$project": { "excitedTitle": { "$concat": [ { "$toString": "$title" }, { "$toString": "!" } ] }, "_id": 0 } }
部分文字列の抽出
substring(str, start) 関数は、start 位置から始まる string の部分を返します。 start の位置は 1 に基づいているため、string の最初の文字は位置 1 にあります。結果を固定の文字数に制限するには、関数を substring(str, start, length) として呼び出します。
0 の start 位置または負の値を渡すと、非表示 ORM 拡張機能は string の先頭から読み取ります。 length も渡す場合、拡張機能は返された長さから最初の位置の前の文字を減算します。例、substring(str, -1, 3) は 1 文字を返し、substring(str, 0, 3) は 2 文字を返します。
次の例では、"The Hunger Games"映画のタイトルの最初の 6 文字を返します。
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); }
部分文字列の検索
locate(pattern, str) 関数は、string 内の pattern の最初の出現の 1 ベースの位置を返します。string にパターンが含まれていない場合は 0 を返します。
特定の位置で検索を開始するには、関数を locate(pattern, str, start) として呼び出します。 start の位置は 1 に基づいているため、string の最初の文字は位置 1 にあります。 0 の start 値または負の数を指定すると、位置 1 から検索が開始されます。
次の例では、映画「"The Hunger Games"」のタイトルにある部分文字列 "Hunger" の位置を返します。
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); }
Substring の置き換え
関数は、string replace(str, pattern, replacement)内の のすべての出現をpatternreplacement に置き換えます。 Hibernetes ORM 拡張機能は $replaceAll 演算子への呼び出しを変換します。 3 つの引数はすべて文字列である必要があります。
次の例では、"The Hunger Games" 映画のタイトルにある部分文字列 "Hunger" を "Video" に置き換えます。
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); }
string からの文字の削除
trim(str) 関数は、string から先頭と末尾のスペースを削除します。文字列の一部の末尾のみから文字を削除するには、trim(leading char from str) または trim(trailing char from str) を使用します。文字列の両方の末尾からスペース以外の文字を削除するには、trim(both char from str) のように both と from キーワードを使用して指定します。
次の例では、"The Hunger Games" 映画のタイトルから先頭の "T" 文字を削除します。
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); }
Hibernetes ORM 拡張機能は、前述のクエリを次の $project ステージに変換します。
{ "$project": { "trimmedTitle": { "$ltrim": { "chars": "T", "input": "$title" } }, "_id": 0 } }
String を埋め込む
pad(str with length leading) 関数と pad(str with length trailing) 関数は、string str の先頭または末尾にスペースを追加することで、指定された length に string を拡張します。スペース以外の文字を使用するには、pad(str with 20 leading char)のように方向の後に文字を指定します。
また、lpad(str, length, padding) 関数と rpad(str, length, padding) 関数を呼び出すこともできます。これらは 1 文字以上の値を含む string を埋め込みます。 Hibernetes ORM 拡張機能は、必要に応じてパディング値を必要な回数繰り返し、ターゲットの長さに達するようにそれを切り捨てます。例、lpad('x', 6, 'ab') は "ababax" を返します。
このような場合、パディングは次のように動作します。
ターゲットの長さが string より小さい場合、 Hibernetes ORM 拡張機能は string をターゲットの長さまで切り捨て、ターゲットの長さの後の文字を削除します。
ターゲットの長さが負の場合、関数は空の string を返します。
パディング値が空の string の場合、関数は元の string を返します。
次の例では、先頭のアスタリスクを使用して、"The Hunger Games"映画のタイトルを 20 文字に埋め込みます。
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); }
string の反復
repeat(str, count) 関数は、str の count コピーを含む string を返します。
次の例では、"The Hunger Games" の映画のタイトルを 2 回繰り返されるように返します。
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); }
詳細情報
クエリフィルターの作成とクエリ ステートメントでの演算子の使用の詳細については、「 クエリの指定」ガイドを参照してください。
クエリで日時関数を呼び出す方法については、「 クエリで日時関数を使用するガイド 」を参照してください。
HQL と JQL を使用してクエリを実行する方法の詳細については、非表示の ORM ドキュメントの「非表示のクエリ言語へのガイド」を参照してください。