我的数据库中有一个CREATED_DATE和MODIFIED_DATE的表。我希望做一些像
这样的事情
select <all the columns>
, CASE WHEN MODIFIED_DATE IS NULL
THEN CREATED_DATE ELSE MODIFIED_DATE END as editDate
FROM TABLE ORDER BY editDate;
使用标准API。
我是怎么做到的?
答案 0 :(得分:0)
根据给定的示例,不需要按最大值2排序,而是按日期排序,即可用时的修改日期和其他创建日期。这可以做到如下。
正确的工具是COALESCE表达式。它返回第一个非空值。当所有参数都为null时,则返回null。
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Object[]> cq = cb.createQuery(Object[].class);
Root<YourEntity> root = cq.from(YourEntity.class);
cq.multiselect(root, cb.coalesce(
root.get("modifiedDate"),
root.get("createdDate")));
cq.orderBy(cb.asc(cb.coalesce(
root.get("modifiedDate"),
root.get("createdDate"))));
List<Object[]> result = em.createQuery(cq).getResultList();
JPQL更具可读性:
SELECT y, (y.modifiedDate, y.createdDate)
FROM YourEntity y
ORDER BY coalesce(y.modifiedDate, y.createdDate)