Java Persistence Criteria API - orderBy()中的case表达式

时间:2016-05-19 13:48:37

标签: java jpa-2.0 criteria-api

如果不是null,我需要按字段对查询结果进行排序。否则由另一个字段进行排序。

这是我的代码:

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

此代码会导致Internal Exception: org.postgresql.util.PSQLException 因为SQL代码中的转换不是"顺序由"我需要:

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

但我不明白我的代码中的错误在哪里。

有什么建议吗? 谢谢

3 个答案:

答案 0 :(得分:1)

如果您使用的是EclipseLink 2.3.x或更早版本,请尝试升级到最近的版本。

我已经使用2.3.x测试了您的代码并失败了,但是从2.4.x接缝开始工作正常。

答案 1 :(得分:0)

将表达式放在一个额外的列中,并按顺序排列该列。与SQL中的相同。

答案 2 :(得分:0)

没办法。我害怕它是一个Eclipse bug(Eclipse Persistence Services - 2.3.2.v20111125-r10461):(

你知道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);

生成此SQL代码(与&#34中的错误相同;&#34顺序;)

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