はじめに
Related information
概要
このドキュメントでは、EBX® の構造化照会言語 (SQL) のクエリと式について説明します。EBX® は、1 つ以上のテーブルから選択された行を取得するための標準 SQL クエリをサポートしています。一部の EBX® SQL 言語機能は、標準の拡張機能です。サポートされている EBX® SQL 構文には、テーブル式 (SELECT、FROM、WHERE、GROUP BY、および HAVING 句)、DISTINCT、ORDER BY、LIMIT、および OFFSET、クエリの組み合わせ (UNION )、および WITH (RECURSIVE修飾子を除く) が含まれます。
この API の目的は、よく知られた標準を使用して EBX® からデータを取得する機能を開発者に提供することです。
EBX® SQL は Java API を介して、特に
Query クラスからアクセスできます。クエリはパラメーターもサポートしています。 Query.setParameter を参照してください。
クエリには、単一のデータセットまたは複数のデータセットを含めることができます。クエリの作成方法の詳細については、
QueryBuilder を参照してください。
データモデルエンティティのマッピング
次のセクションでは、EBX® の概念の SQL へのマッピングについて詳しく説明します。
テーブル (データモデル内)
EBX® テーブルは、SQL テーブルに自然にマッピングされます。データモデルには、同じ名前の EBX® テーブルが複数存在する場合があります。このあいまいさは、テーブルがグループにある場合に発生する可能性があります。あいまいさを取り除くには、二重引用符で囲まれたテーブルのフルパスを使用します (たとえば、
"my_group/my_table" は "other_group/my_table" と競合しなくなります)。データモデル内で一意のテーブルのエンティティ名を使用することもできます。テーブル名は、エンティティ名または別のテーブル名と競合しない場合にのみ使用できます。
以下も参照してください。:
フィールド
SQL 標準では、テーブルの構造は 1 つ以上の列で構成されます。親が EBX® テーブルであるすべてのエレメント (フィールドを含む) は、列にマップされます。
グループ
SQL 標準では、テーブルの構造は 1 つ以上の列で構成されます。親が EBX® テーブルであるすべてのエレメントは、列にマップされます。これには、SQL 構造タイプとして SQL 列にマッピングされるグループが含まれます。
関連付け
SQL 標準では、複数のテーブル間でのデータのクエリは、外部キーと主キーに基づいています。EBX® のこれらの概念は、SQL の概念と似ています。したがって、SQL のテーブル間の結合は、EBX® 外部キーと主キーを使用して実行することもできます。
データ型のマッピング
SQL を介したデータの処理は、そのデータ型に大きく依存します。たとえば、述語では、列が同じ SQL データ型を持っている場合にのみ列を比較できます。SQL データ型は、データモデルの型に応じた型です。
単純データ型
サポートされている標準 SQL データ型
この表は、EBX® でサポートされている XML スキーマで定義されているすべての単純型と、それに対応する標準 SQL 型を示しています。
| XML スキーマタイプ | SQL タイプ | Java タイプ | 注意 |
|---|---|---|---|
xs:string |
VARCHAR |
java.lang.String |
|
xs:boolean |
ブール値 |
java.lang.Boolean |
値:TRUE、FALSE、UNKNOWN |
xs:decimal |
10 進数 |
java.math.BigDecimal |
|
xs:dateTime |
タイムスタンプ |
java.util.Date |
|
xs:time |
時間 |
java.util.Date |
返される Date の日付部分は常に「1970/01/01」に設定されます。 |
xs:date |
日付 |
java.util.Date |
返される Date の時間部分は、常に 1 日の始まり (つまり、「00:00:00」) に設定されます。 |
xs:anyURI |
VARCHAR |
java.net.URI |
|
xs:Name ( xs:string restriction) |
VARCHAR |
java.lang.String |
|
xs:int |
整数 |
java.lang.Integer |
EBX® で定義された拡張単純型
EBX® は、事前定義された単純データ型を提供します。これらのタイプは、内部スキーマ
common-1.0.xsd によって定義されます。それらの定義については、EBX® で定義された拡張単純型のセクションで詳しく説明しています。
| XML スキーマタイプ | SQL タイプ | Java クラス |
|---|---|---|
osd:text ( xs:string restriction) |
VARCHAR |
java.lang.String |
osd:html ( xs:string restriction) |
VARCHAR |
java.lang.String |
osd:email ( xs:string restriction) |
VARCHAR |
java.lang.String |
osd:password ( xs:string restriction) |
VARCHAR |
java.lang.String |
osd:color ( xs:string restriction) |
VARCHAR |
java.lang.String |
osd:resource ( xs:anyURI restriction) |
VARCHAR | 内部クラス |
osd:locale ( xs:string restriction) |
VARCHAR |
java.util.Locale |
osd:dataspaceKey ( xs:string restriction) |
VARCHAR |
java.lang.String |
osd:datasetName ( xs:string restriction) |
VARCHAR |
java.lang.String |
リスト (複数値) タイプ
リストは SQL 配列として処理されます。対応する Java クラスは
java.util.List です。
注意:複数値フィールドでフィルタリングするには、まず
UNNEST SQL 演算子を使用して「正規化」する必要があります (これはパフォーマンスの観点から推奨されず、大規模なテーブルでは非常に非効率になる可能性があることに注意してください)。
-
SELECT T.s FROM myTable T, UNNEST(T.list) as L(item) WHERE L.item = 'test' -
SELECT p.name FROM Person p, UNNEST(p.addresses) AS ad(street, city) WHERE ad.city = 'Paris'
複合型
複合型は SQL 構造化型として扱われます。対応する Java クラスは
Object[] です。これは、外部キー (以下を参照) とグループに適用されます。これらは、複合型によって定義されているためです。ドット演算子を使用して、SQL 構造型内のフィールドにアクセスします。たとえば、複合型の場合は、 address.street を使用してフィールド address のフィールド street にアクセスします。クエリで複合型のサブフィールドを参照する場合は、常にテーブル名またはエイリアスを使用する必要があります。
-
SELECT customer.address.street FROM customer -
SELECT c.address.street FROM customer c
TableRef 型
EBX® では、テーブルに複数のフィールドで構成される主キーを含めることができます。外部キーは、
osd:tableRef 宣言のある単一のフィールドによって定義されます。標準の SQL 構文が拡張され、対象の主キーフィールドの値が抽出されるようになりました。外部キーの抽出の例では、次の SQL 式が有効です。
-
tableA.fkb.id = 123 -
YEAR(tableA.fkb.date) > 2018
注意:
主キーが 1 つのフィールドのみで構成されている場合でも、値にアクセスするにはフィールドの名前を指定する必要があります。たとえば、主キーが単一の
id で構成されている場合、 tableA.fkb.id = 123 のように、値にアクセスするには fkb.id を使用する必要があります。
tableRef の使用法の典型的な例は、SQL 結合です。
SELECT * FROM employee JOIN department ON employee.fkDept.id = department.id
または、参照されるテーブルに複合主キーがある場合
SELECT * FROM tableA JOIN tableB ON tableA.fkB.id1 = tableB.id1 AND tableA.fkB.id2 = tableB.id2
同様に、
FK_AS_STRING ビルトイン関数と $pk システム列を使用して、キーの文字列表現を介して同じ JOIN を実行できます。
SELECT * FROM tableA JOIN tableB ON FK_AS_STRING(tableA.fkB) = tableB."$pk"
メタデータフィールド
EBX® SQL は、一部のメタデータ情報へのアクセスも提供します。これらのフィールドは、明示的に参照されない限り、SQL ステートメントによって返されません。たとえば、「
SELECT * FROM ...」はメタデータフィールドを返しませんが、「 SELECT metadataField FROM ...」は返します。
| 名前 | 説明 | SQL タイプ | Java クラス | 例 |
|---|---|---|---|---|
creator |
レコードの作成者。 |
VARCHAR |
java.lang.String |
SELECT t."ebx-metadata"."system"."creator" FROM myTable t SELECT t.* FROM myTable t WHERE t."ebx-metadata"."system"."creator" = 'Uuser1' SELECT t.* FROM myTable t ORDER BY t."ebx-metadata"."system"."creator" |
creation_time |
レコードの作成時刻。 |
タイムスタンプ |
java.util.Date |
SELECT t."ebx-metadata"."system"."creation_time" FROM myTable t SELECT t.* FROM myTable t WHERE t."ebx-metadata"."system"."creation_time" > TIMESTAMP'2001-06-10 14:57:20' SELECT t.* FROM myTable t ORDER BY t."ebx-metadata"."system"."creation_time" |
updater |
レコードを変更した最後のユーザー。 |
VARCHAR |
java.lang.String |
SELECT t."ebx-metadata"."system"."updater" FROM myTable t SELECT t.* FROM myTable t WHERE t."ebx-metadata"."system"."updater" = 'Uuser1' SELECT t.* FROM myTable t ORDER BY t."ebx-metadata"."system"."updater" |
update_time |
レコードの最終変更時刻。 |
タイムスタンプ |
java.util.Date |
SELECT t."ebx-metadata"."system"."update_time" FROM myTable t SELECT t.* FROM myTable t WHERE t."ebx-metadata"."system"."update_time" > TIMESTAMP'2001-06-10 14:57:20' SELECT t.* FROM myTable t ORDER BY t."ebx-metadata"."system"."update_time" |
システム列
テーブルに存在するフィールドとは別に、EBX® SQL はいくつかの追加のシステム列を提供します。これらの列は、明示的に参照されていない限り、SQL ステートメントによって返されません。たとえば、「
SELECT * FROM ...」はシステム列を返しませんが、「 SELECT systemColumnName FROM ...」は返します。
|
名前
|
説明
|
SQL タイプ
|
Java クラス
|
例
|
|---|---|---|---|---|
$adaptation
|
テーブルレコードを表す 。
|
内部型
|
com.onwbp.adaptation.Adaptation
|
SELECT t."$adaptation" FROM myTable t WHERE t.value>100
|
$pk
|
レコードの主キーの文字列表現。
以下も参照してください。:
|
VARCHAR
|
java.lang.String
|
SELECT t.* FROM myTable1 t WHERE t."$pk"='123'
SELECT t.* FROM myTable2 t WHERE t."$pk"='123|abc'
SELECT t."$pk" FROM myTable3 t WHERE t.value>100
SELECT t.value FROM myTable3 t ORDER BY t."$pk"
|
SQL 構文
サポートされている標準の演算子と関数
演算子は、比較や算術演算などの演算を実行するために、主に SQL ステートメントの WHERE 句で使用される予約語または文字です。これらの演算子は、SQL ステートメントで条件を指定し、ステートメントで複数の条件の接続詞として機能するために使用されます。EBX® は、ほとんどの SQL 標準演算子と関数をサポートしています。一部の関数と演算子は、オプションのパラメーターを持つことができます。ドキュメントでは、それらは角括弧で囲まれています。一般に、演算子と関数には 5 つのタイプがあります。
-
次の表は、すべての演算子の結合性と優先順位を、高い順に示しています。
識別子のエスケープ
次の場合、識別子は二重引用符を使用してエスケープする必要があります。
-
絶対パスを使用してテーブルを識別する場合 (たとえば、「/root/myTable」)。
-
識別するフィールドが予約語の場合 (「user」、「order」など)。
-
テーブルエイリアス (たとえば、t."$adaptation", t."$pk" でシステム列を参照する場合)。
-
メタデータフィールドを参照する場合 (たとえば、t."ebx-metadata"."system"."creation\_time")。
次の例は、すべてのケースを例示するためのクエリを示しています。
SELECT t."user", t."$pk" FROM "/root/myTable" t WHERE t."order" = 1
プラン情報
EBX® SQL は
EXPLAIN PLAN FOR ... 構文をサポートして、クエリのプラン情報を取得します。
結果は
Query.explain に似ています。
例:
EXPLAIN PLAN FOR SELECT id FROM myTable
制限とパフォーマンスのガイドライン
-
内部結合の最適化では、RIGHT 結合と FULL 結合がサポートされていないため、可能であればこれらの結合タイプは避けてください。
-
数値または 10 進値の最大精度とスケールは 1000 です。
-
GROUP BYや集約関数 (MIN、MAXなど) を使用したクエリは最適化されませんが、COUNTは状況に応じて最適化されます。 -
現在、
MINおよびMAX演算子は内部インデックスを利用していません。代わりに、次の同等のクエリを使用してください。多くの場合、これらはより効率的です。SELECT val FROM myTable ORDER BY val DESC NULLS LAST LIMIT 1instead ofSELECT MAX(val) FROM myTableSELECT val FROM myTable ORDER BY val LIMIT 1instead ofSELECT MIN(val) FROM myTable