ПОРЯДОК ПО «столбцу ОБРАЩЕНИЯ» в JPA

#jpa #jpql

#jpa #jpql

Вопрос:

Я хочу УПОРЯДОЧИТЬ ПО оператору 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 
 

Комментарии:

1. Некоторая реклама, чтобы изменить это для спецификации JPA 3.0: github.com/eclipse-ee4j/jpa-api/issues/297

Ответ №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
 

Комментарии:

1. Второй вариант работает нормально, но он занимает больше времени, чем должен, только с одним обращением. Что я сделал, так это то, что я установил значение CASE в Java, и я поставил CASE WHEN только в предложении ORDER BY . Он работал отлично и быстрее, чем старый SQL, который был в приложении.

Ответ №2:

Сейчас я не в состоянии протестировать, поэтому я не уверен, является ли это допустимым синтаксисом, но не могли бы вы добавить к нему «КАК»?

 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
 

Комментарии:

1. Нет. По крайней мере, это не указано в JPA (пока?). См. github.com/eclipse-ee4j/jpa-api/issues/297