4

JPA 2.0仕様を読んだところ、次のことが有効であるはずです。

select e.employeeId, new com.foo.Custom(e.employeeName, e.employeeCity) from Employee e

ただし、Hibernate は最初のコンマを引用して、このクエリについて文句を言います。選択した式の順序を逆にしても、まだ文句を言います:

select new com.foo.Custom(e.employeeName, e.employeeCity), e.employeeId from Employee e

しかし、コンストラクター式のみを選択すると、機能します。

select new com.foo.Custom(e.employeeName, e.employeeCity) from Employee e

JPA 2.0 仕様の文法では許可されているように見えますが、SELECT 句の唯一の式ではないコンストラクター式を使用する JPQL クエリの Web 上の例を探しても無駄でした。選択したレコードのすべてのデータをカプセル化する別のモノリシック カスタム クラスを作成する以外に、この回避策を知っている人はいますか?

4

1 に答える 1

2

Hibernate-JPA ( org.hibernate.hql.internal.ast.QuerySyntaxException) および EclipseLink (OK) でクエリを試行しました。

次に、Hibernateで同様の 2008 年バグを見つけました。これらのクエリは、EclipseLink でも正常に実行されます。

Hibernate (HQL) のバグだと思います。

ドキュメンテーションによると

JPQL は、HQL に大きく影響を受けたサブセットです。JPQL クエリは常に有効な HQL クエリですが、その逆は当てはまりません。

実際、Hibernate は HQL と同じ文法/パーサーで JPQL クエリを解析します。

次に、ソース ファイル(HQL ANTLR 文法) を調べます。次のように表示されます。

selectClause
: SELECT^   // NOTE: The '^' after a token causes the corresponding AST node to be the root of the sub-tree.
    { weakKeywords(); } // Weak keywords can appear immediately after a SELECT token.
    (DISTINCT)? ( selectedPropertiesList | newExpression | selectObject )
;

newExpression
: (NEW! path) op:OPEN^ {#op.setType(CONSTRUCTOR);} selectedPropertiesList CLOSE!
;

これで、Hibernate が をスローする理由が明らかになりQuerySyntaxExceptionました。Hibernate JPQL を使用する場合、次の 3 つのオプションのいずれかを選択する必要があります。

  • プロパティ リスト (つまりe.employeeName, e.employeeCity)
  • コンストラクター式 (すなわちnew com.foo.Custom(e.employeeName, e.employeeCity))
  • 'FROM' 句からのオブジェクト識別子 (つまりe)
于 2014-04-27T07:05:38.483 に答える