【问题标题】:ORDER BY "CASE column" in JPAJPA 中的“CASE 列”排序
【发布时间】:2011-12-18 23:55:28
【问题描述】:

我想按 case 语句排序,可以吗?我该怎么做?

SELECT new com.systemname.to.UserDataHolder(u.userId, 
CASE  WHEN (u.place.cityId = :cityId) THEN 1  WHEN (u.place.stateId = :stateId) THEN 2  ELSE 3 END)  
FROM User u 
ORDER BY u.userId DESC 

【问题讨论】:

标签: jpa jpql


【解决方案1】:

您使用的是什么 JPA 提供程序?

试试,

SELECT u.userId, 
(CASE  
    WHEN (u.place.cityId = :cityId) THEN 1
    WHEN (u.place.stateId = :stateId) THEN 2
    ELSE 3 END) as myNum
FROM User u 
ORDER BY u.userId, myNum DESC

或者,

SELECT new com.systemname.to.UserDataHolder(u.userId, 
CASE  
    WHEN (u.place.cityId = :cityId) THEN 1
    WHEN (u.place.stateId = :stateId) THEN 2
    ELSE 3 END)
FROM User u 
ORDER BY u.userId, CASE  
    WHEN (u.place.cityId = :cityId) THEN 1
    WHEN (u.place.stateId = :stateId) THEN 2
    ELSE 3 END DESC

【讨论】:

  • 第二个选项工作正常,但它比只使用一个 CASE 需要更长的时间。我所做的是,我在 Java 中设置了 CASE 值,并将 CASE WHEN 仅放在 ORDER BY 子句上。它比应用程序上的旧 SQL 运行得更好、更快。
【解决方案2】:

现在无法测试,所以我不确定这是否是有效的语法,但你能在其中添加一个“AS”吗?

SELECT new com.systemname.to.UserDataHolder(u.userId, 
CASE  
    WHEN (u.place.cityId = :cityId) THEN 1
    WHEN (u.place.stateId = :stateId) THEN 2
    ELSE 3 END as myNum)
FROM User u 
ORDER BY u.userId, myNum DESC

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2013-08-25
  • 2015-03-20
  • 2017-09-26
  • 2017-05-02
  • 1970-01-01
相关资源
最近更新 更多