2016-05-19 20 views
0

私のクエリの結果をフィールドで、そうでなければ別のフィールドで順序付けする必要があります。Java Persistence Criteria API - case式in orderBy()

これは私のコードです:

Expression condizione=cb.isNotNull(root.get(Attribuzione_.dataprincipale)); 
Expression principale=root.get(Attribuzione_.dataprincipale); 
Expression creato=root.get(Attribuzione_.recordcreato); 
Order ord=cb.desc(cb.selectCase() 
     .when(condizione, principale) 
     .otherwise(creato)); 
cq=cq.orderBy(ord); 

SQLコード内の翻訳は、私が必要とする "順" ではありませんので、このコードはInternal Exception: org.postgresql.util.PSQLException が発生します。

ORDER BY CASE WHEN (t0.dataprincipale IS NOT NULL) THEN (t0.dataprincipale IS NOT NULL) ELSE t0.rec_creato END DESC 

代わりの

ORDER BY CASE WHEN (t0.dataprincipale IS NOT NULL) THEN t0.dataprincipale ELSE t0.rec_creato END DESC 

しかし、私はどこに欠陥があるのか​​わかりませんコード。

提案がありますか? ありがとう

答えて

1

(「順」と同じエラーで)このSQLコードを生成し、最近のものにアップグレードしてみてください。

私は2.3.xであなたのコードをテストして失敗しましたが、2.4.xの継ぎ目からうまく動作します。私は通常、THEN ... ELSE ... `CASE BY ORDERを書くPostrgres SQLで

0

式を余分な列に置き、その列をorderByに置きます。 SQLと同じです。

+0

... END';) あなたは ' T0を選択する意味ですか*、CASE(t0.dataprincipaleがNULLされていないとき。 )THEN t0.dataprincipale ELSE t0.rec_creato END AS orderby_data アトリビューションt0 ORDER BY orderby_data' ? Criteria APIで翻訳しようとしています。それは私の最初のアプローチです... ありがとうございました –

+0

SQLは、歴史的にORDER BY列の表現力が制限されています。 JPAは、通常、少し後にSQL方言を実装します。標準SQLに近づくことは、依然として利点があります。 –

0

途中です。 :(

あなたは、Eclipseのバグについて知っています

コード

CriteriaQuery<Tuple> cqt= cb.createTupleQuery(); 
Root<Attribuzione> roott = cqt.from(Attribuzione.class); 
cqt.multiselect(cb.selectCase() 
      .when(cb.isNotNull(roott.get(Attribuzione_.dataprincipale)), roott.get(Attribuzione_.dataprincipale)) 
      .otherwise(roott.get(Attribuzione_.recordcreato)), roott); 
cqt = cqt.where(cb.equal(roott.get(Attribuzione_.esecutoreprincipale), "pivamichela")); 
TypedQuery<Tuple> tq = em.createQuery(cqt); 

- 私はそれがEclipseのバグ(2.3.2.v20111125-r10461 Eclipseの永続性サービス)ですが怖いです?あなたがのEclipseLink 2.3.x以降または古いを使用している場合

SELECT CASE WHEN (dataprincipale IS NOT NULL) THEN (dataprincipale IS NOT NULL) ELSE rec_creato END , ID, dataletto, dataprincipale, esecutoreletto, esecutoreprincipale, evidenza, letto, principale, rec_creato, rec_creato_da, rec_modificato, rec_modificato_da, protocollo, ufficio FROM PROTOCOLLO.ATTRIBUZIONE WHERE (esecutoreprincipale = ?)