2

Hibernate では、「.id」とだけ言うことができます。私が持っているとしましょう:

@Entity public class Customer {
  @Id private Integer customerId;
  @Basic private String customerName;
  // getters and setters
}

そして、IDで顧客の名前を取得したい:

SELECT cust.customerName FROM Customer cust WHERE cust.id = :customerId

ショートカットとして、「customerId」ではなく「id」を使用していることに注意してください。これは有効な JPQL ですか、それとも Hibernate でのみ有効ですか?

4

1 に答える 1

2

JPA 仕様では、このようなショートカットは定義されていません。状態フィールド (Idプロパティを含む) へのアクセスは名前によるものです。

4.3 抽象スキーマ型とクエリ ドメイン

(...)

非形式的には、エンティティの抽象スキーマ タイプは次のように特徴付けることができます。

  • エンティティ クラスのすべての永続フィールドまたは get アクセサー メソッド (永続プロパティの場合) には、抽象スキーマ型がフィールドの型またはアクセサー メソッドの結果型に対応するフィールド (「状態フィールド」) があります。
  • エンティティ クラスのすべての永続関係フィールドまたは get アクセサー メソッド (永続関係プロパティの場合) には、関連するエンティティの抽象スキーマ型 (または、関係が1 対多または多対多、そのようなコレクション)。

(...)

つまり、これは Hibernate 固有のものなので (セクション14.5. identifier プロパティの参照を参照)、JPQL を記述したい場合はこれに依存しないでください。


これは、たとえばEclipseLinkで得られるものです(フィールドMyEntityはありませんid):

java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Error compiling the query [select e from MyEntity e where e.id = :id], line 1, column 33: unknown state or association field [id] of class [com.acme.MyEntity].
于 2010-06-21T19:50:02.553 に答える