2011-12-14 8 views
4

私はいくつかのドメインクラスの記述子クラスを持っています。記述子クラスは、列挙型でありドメインクラスの型を示すフィールド 'type'を持つ。いくつかのクエリでは、より多くの記述子を返し、その型をコンストラクタ引数として渡したいと思います。だから私の考えは、クエリパラメータとして渡すことでした:JPQL:SELECT NEWクエリの列挙型リテラル

String jpql = "SELECT NEW model.ModelDescriptor" 
    + "(t.id, t.name, t.description, :modelType) ... "; 
    TypedQuery<ModelDescriptor> query = em.createQuery(jpql, ModelDescriptor.class); 
    query.setParameter("modelType", ModelType.forClass(clazz)); 
    List<ModelDescriptor> list = query.getResultList(); 

これは動作しません。例外はスローされませんが、タイプはnullです。また、クエリのリテラル列挙型を渡すことはできません。

"SELECT NEW model.ModelDescriptor (f.id, f.name, f.description, 
    model.ModelType.FLOW) ... " 

編集 は、私は次のスタックトレースを取得:

java.lang.IllegalArgumentException: An exception occurred while creating a query in 
    EntityManager: 
    Exception Description: Error compiling the query [SELECT model.ModelDescriptor(f.id, 
    f.name, f.description, model.ModelType.FLOW) FROM Flow f WHERE flow.id = :flowId], 
    line 1, column 78: unknown identification variable [model]. The FROM clause of the 
    query does not declare an identification variable [model]. 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl. 
     createQuery(EntityManagerImpl.java:1477) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl. 
      createQuery(EntityManagerImpl.java:1497) 

は私が永続化フレームワークとしてのEclipseLinkを使用します。

SELECT NEW式にenumリテラルを渡す方法はありますか?

答えて

4

いいえ、一般的にどのクラスのフィールドも参照する方法がなく、またSELECT句に引数を渡すこともできません。コンストラクタ式にのみ有効な引数は(JPA 2.0仕様、174ページから)への回答やヒントの

  • single_valued_pa​​th_expression
  • scalar_expression
  • aggregate_expression
  • identification_variable
+2

感謝しています仕様。しかし、この仕様では、scalar_expressionはenum_primary(p。154)、enum_primaryはenum_literal(p。177)にすることもできます。しかし、リテラルを使用すると例外が発生します。私は自分の質問を更新し、スタックトレースを追加しました。 – Michael

+0

うまく見つかった、紛らわしいBNF。とにかく、コンストラクタの式やSELECT節で一般的に動作するとは思いません。彼らがどこかにはっきりと綴っているかどうかをもっと確認しなければならない。 –

+0

として報告(投票してください!)https://hibernate.atlassian.net/browse/HHH-9875 –