1

クエリを実行しようとしているときに、 が何を表しているのか興味がありoます。

デフォルトでは、私のクエリは
@NamedQuery (name="newName" query=SELECT o FROM tableView o)

が何をo表しているのか興味があります。私は手紙xc同様に使用するいくつかの例を見てきました. あるとすれば、どのような違いがあるのか​​ 疑問に思っています。*また、行全体を選択するために a を使用できないのはなぜですか?

4

2 に答える 2

1

JQPL用語では識別変数と呼びます。SELECT ステートメントで使用する場合、識別変数は FROM 句で宣言されます。クエリの結果として、(エンティティの) 永続属性、エンティティ自体、または永続属性から推定される値が設計されている場合は、SELECT ステートメントで使用することが必須です。

SELECT a.someAttribute FROM EntityA a 
SELECT a FROM EntityA a 
SELECT SUM(a.someAttribute) FROM EntityA a

使用しない同じクエリa.は、有効な JQPL クエリではありません。クエリ言語としての HQL にはかなりの数の拡張機能があるため、それらは Hibernate で機能します。

同一の名前の属性を持つ複数のエンティティがクエリに含まれている場合、識別変数の必要性は明らかです。

SELECT a.someAttribute, b.someAttribute 
FROM EntityA a, EntityB 
WHERE a.id = b.id

上記のクエリからわかるように、識別変数は WHERE 句でも使用されます。JPA 2.0仕様からの次の引用は、他の用途とそれらの宣言も非常に厳密にまとめています。

SELECT または DELETE ステートメントの SELECT、WHERE、ORDER BY、GROUP BY、または HAVING 句で使用されるすべての識別変数は、FROM 句で宣言する必要があります。UPDATE ステートメントの WHERE 句で使用される識別変数は、UPDATE 句で宣言する必要があります。

識別変数​​は、これらの句で存在量化されます。これは、識別変数がコレクションのメンバーまたはエンティティの抽象スキーマ型のインスタンスを表すことを意味します。識別変数​​がコレクション全体を指定することはありません。

識別変数​​は、それが定義されているクエリ (またはサブクエリ) にスコープが設定され、同じ名前の識別変数を定義していないそのクエリ スコープ内のすべてのサブクエリにも表示されます。

識別変数​​の命名は自由ですが、予約済みの識別子やエンティティの名前であってはなりません。

JPQLにはそのような構造がないため、「SELECT *」は使用できません。選択する値のリストを明示的に指定しないことは、SQL のアンチ パターンと見なされることもよくあります。たとえば、結合がクエリに追加されたときに選択されるものを再定義する必要があります。

于 2012-07-18T06:01:30.137 に答える
0

これは単なるエイリアスです。好きなものを使用できます。あなたの例では実際には必要ありませんが、複数のテーブルを結合するより複雑な例では、特定のテーブルのプロパティを参照できます。例えば:

SELECT A from tableA A, tableB B where B.someId=A.id;
于 2012-07-18T00:55:21.260 に答える