“订购”;“案例栏”;在JPA中

“订购”;“案例栏”;在JPA中,jpa,jpql,Jpa,Jpql,我想按案例陈述订购,可以吗?我怎么做 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 现在无法进行测试,所以我不确定这是否是有效的语法,但您能在其中添加一个“

我想按案例陈述订购,可以吗?我怎么做

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 

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


您使用的是什么JPA提供商

试试看

或者


第二种方法可以很好地工作,但仅在一种情况下,所需的时间比应该的要长。我所做的是,我在Java中设置了CASE值,并将CASE仅放在orderby子句上。它比应用程序上的旧SQL运行得更完美、更快。至少JPA没有明确规定这一点(还没有?)。有关JPA 3.0规范的更改,请参见一些广告:
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
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