2010-11-17 40 views
3

我有一个会话表。每个会话都有“session_start_time”和“session_end_time”。会议开放时,结束时间为空。我想获取会话列表,并按照以下逻辑进行排序:通过在JPQL /休眠中更改列排序

  1. 如果会话已打开(无结束时间),则按开始时间排序。
  2. 如果会话已关闭,则按结束时间排序。

喜欢的东西:

ORDER BY (session_end_time == null) ? session_start_time : session_end_time 

我使用JPA和JPQL的查询,使用Hibernate的执行。你会推荐什么?

注意:我宁愿不将CASE添加到SELECT,而是保持它干净,所以我得到的会议列表没有额外的不需要的字段。

回答

1

ORDER BY NVL(session_end_time,session_start_time)

NVL是Oracle功能。我敢肯定,疗法都是这样的功能对于其他DBMS

找到这一个休眠: NVL在Hibernate中:How to simulate NVL in HQL

ORDER BY:https://forum.hibernate.org/viewtopic.php?f=25&t=997220&start=0

+0

这有帮助,谢谢!合并确实有效,并且比使用CASE更快。我需要验证它是否也可以在JPQL中工作(到目前为止在SQL上测试过)。 – 2010-11-17 12:48:21

+0

它在JPQL上完美地工作。谢谢! – 2010-11-18 13:39:02

1

是否在你的DBMS

ORDER BY CASE 
    WHEN session_end_time IS NULL THEN session_start_time 
    ELSE session_end_time 
END 

工作?这不会添加一个字段。

否则,你可以计算出它的嵌套查询中,但不包括它的最终SELECT子句中:

SELECT field1, field2 FROM (
    SELECT field1, field2, CASE WHEN session_end_time... END AS dummyfield 
) Q 
ORDER BY Q.dummyfield 
+0

的情况下做的PostgreSQL的工作。看起来像你的其他选项增加了一个额外的列到结果集,我喜欢避免。与COALESCE相比,CASE执行速度较慢(无订单为1.7毫秒,合并为5.61,情况为6.89),所以我可以选择Coalesce。 – 2010-11-17 12:47:28

+0

另一个选项不会添加另一列,因为计算列未在“SELECT”子句中提及。 'COALESCE'很好用,而不是'CASE'在这个问题上,我只是没有想到它...... – thomaspaulb 2010-11-17 13:03:08

+0

哦,哦,对了,我现在看到它!这是另一个有趣的方法,但我似乎无法做到这一点,选择“*”,这是我想在JPQL中做的。 – 2010-11-17 13:10:49