サンプルクエリ:
SELECT e FROM Employee e WHERE SUBSTRING(e.name, 3) = 'Mac'
この構文では、 が宣言または定義された (?) と言うSELECT e
のe
は直感的に思えます。しかし、2番目は冗長ではありませんe
かFROM Employee e
?
これは、 SQL SELECT 構文への逆戻りまたは類似点ですか?
2 つ目e
は識別変数です。実際には、クエリの別の場所で使用していること、およびエンティティを参照していることe
を JPQL パーサーに伝えることによって定義します。の最初の出現は、それを使用する場所です。e
Employee
e
e
したがって、冗長ではありません。最初のものを省略すると、JPQL パーサーは何を選択すればよいかわかりません。2 回目に省略した場合は、JPQL パーサーが認識しないものを選択していることになります。
JPQL 構文は、通常の SQL 構文とは少し異なります。サンプルによると、最初の e は通常の SQL の * を表します。したがって、冗長ではありません。ただし、JPA 2.x を使用している場合は、条件クエリを使用する方が JPQL よりも優れています
免責事項: この情報は HQL に対応するため、JPA 実装としての Hibernate でのみ機能します。
この単純なケースe
では、(エイリアスにすぎません) を使用する必要はありません。完全なエンティティを選択しているため、そのselect e
部分を記述する必要さえありません。したがって、次のように書くことができます。
FROM Employee WHERE SUBSTRING(name, 3) = 'Mac'
説明:
from
探しているエンティティを指定します。のe
後ろにあるのは、オブジェクト全体 (パーツ) またはオブジェクトの属性をアドレス指定するために使用できるEmployee
単なるエイリアスです。単純なクエリでは必要ありませんが、クエリにジョインがある場合は、常にエイリアスを使用することをお勧めします。Employee
select
select
一部は、取得するエンティティの属性を選択するためのものです。この場合「select e」を省略するとpart or just specify the alias (
、JPA はエンティティ全体を返します。SQL では、これは通常は機能しません (少なくとも Oracle の場合)。コメントで質問に答えるには:クエリの一部でエイリアスを使用できます。しかし、そのためには、これが何を指しているのかを JPA に教えなければなりません。そして、これがその部分がしていることです。e
select
e
from Employee e
ほら。" (あなたが持っている列)
SELECT e.name, e.e FROM Employee e WHERE SUBSTRING(e.name, 3) = 'Mac'
IMO この場合、2 番目の e を使用する必要はありません (はい、冗長です)。このような単一のクエリがある場合。2 つのテーブルを結合し、それらの 2 つのテーブルに共通の列名がある場合、そのテーブル エイリアス 'e' を使用して各列を選択することは理にかなっています。