2014-02-07 30 views
0

我在我的數據庫中有CREATED_DATE和MODIFIED_DATE兩個表。我希望能做類似使用休眠標準按MAX排序2個日期squery


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

根據給定的例子,它不需要按最大值2進行排序,而是按日期排序,修改日期時可用,否則爲createdDate。這可以做到如下。

正確的工具是COALESCE表達式。它返回第一個非空值。當所有參數都爲空時,則返回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)