使用hibernate条件查询按MAX排序2个日期

时间:2014-02-07 13:49:04

标签: java sql hibernate criteria-api hibernate-criteria

我的数据库中有一个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。

我是怎么做到的?

1 个答案:

答案 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)