2016-05-19 5 views
0

Ich muss das Ergebnis meiner Abfrage durch ein Feld bestellen, wenn nicht Null, sonst durch ein anderes Feld.Java Persistency Criteria API - Groß- und Kleinschreibung in orderBy()

Dies ist mein Code:

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); 

Dieser Code verursacht eine Internal Exception: org.postgresql.util.PSQLException , weil die Übersetzung in SQL-Code nicht die "order by" ist ich brauche:

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

statt

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

Aber ich verstehe nicht, wo ist der Fehler in meinem Code.

Irgendwelche Vorschläge? Vielen Dank

Antwort

1

Wenn Sie Eclipse 2.3.x oder älter verwenden, versuchen Sie zu einem kürzlich ein Upgrade.

Ich habe Ihren Code mit 2.3.x getestet und schlägt fehl, aber ab 2.4.x Nähte funktionieren gut.

0

Platzieren Sie den Ausdruck in eine zusätzliche Spalte, und bestellen Sie diese Spalte. Das Gleiche wie in SQL.

+0

In Postrgres SQL ich normalerweise 'ORDER BY CASE schreiben ... THEN ... ELSE ... END';) Meinten Sie ' t0 SELECT *, CASE WHEN (t0.dataprincipale IS NOT NULL.) THEN t0.dataprincipale ELSE t0.rec_creato ENDE AS orderby_data VON Attribuzione t0 ORDER BY orderby_data' ? Ich versuche, es in Criteria API zu übersetzen. Es ist meine erste Annäherung ... Danke –

+0

SQL hat historisch eine eingeschränkte Ausdruckskraft für ORDER BY-Spalten. JPA implementiert SQL-Dialekte in der Regel etwas später und weniger vollständig. Die Nähe zu einem Standard-SQL hat immer noch seinen Vorteil. –

0

Kein Weg. Ich habe Angst vor es ist ein Eclipse-Bug (Eclipse-Persistence Services - 2.3.2.v20111125-r10461)? :(

Haben Sie einen Fehler in Eclipse wissen

Der Code

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); 

erzeugen diese SQL-Code (mit dem gleichen Fehler wie in der „order by“)

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 = ?) 
Verwandte Themen