Java 持久性标准 API - orderBy() 中的 case 表达式
Java Persistence Criteria API - case expressions 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);
此代码导致 Internal Exception: org.postgresql.util.PSQLException
因为 SQL 代码中的翻译不是我需要的 "order by":
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
但是我不明白我的代码哪里出了问题。
有什么建议吗?
谢谢
将表达式放在一个额外的列中,并按该列排序。与 SQL.
相同
没办法。我担心这是一个 Eclipse 错误(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 代码(与 "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 = ?)
如果您使用的是 EclipseLink 2.3.x 或更早版本,请尝试升级到最新版本。
我已经用 2.3.x 测试了你的代码但失败了,但是从 2.4.x 接缝可以正常工作。
如果不为空,我需要按一个字段对查询结果进行排序,否则按另一个字段进行排序。
这是我的代码:
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":
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
但是我不明白我的代码哪里出了问题。
有什么建议吗? 谢谢
将表达式放在一个额外的列中,并按该列排序。与 SQL.
相同没办法。我担心这是一个 Eclipse 错误(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 代码(与 "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 = ?)
如果您使用的是 EclipseLink 2.3.x 或更早版本,请尝试升级到最新版本。
我已经用 2.3.x 测试了你的代码但失败了,但是从 2.4.x 接缝可以正常工作。