#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