2011-10-31 6 views
5

Chcę ZAMÓWIĆ PRZEZ Oświadczenie sprawy, czy to możliwe? Jak mogę to zrobić?ZAMÓWIENIE PRZEZ "kolumnę CASE" w JPA

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 

Odpowiedz

5

Jakiego dostawcy JPA korzystasz?

spróbować

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 

lub

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 
+0

Druga opcja działa dobrze, ale zajmuje tylko dłużej niż powinna, tylko z jedną przypadkiem. To, co zrobiłem, ustawiłem wartość CASE w Javie i umieściłem CASE WHEN tylko na klauzuli ORDER BY. Działał doskonale i szybciej niż stary SQL, który był na aplikacji. – pringlesinn

+0

czy możemy zrobić to samo z kolejnością sortowania ASC lub DESC? Próbowałem użyć tego, ale otrzymałem nieoczekiwany token ASC? –

0

nie jest w stanie przetestować teraz, więc nie jestem pewien, czy to jest prawidłowa składnia, ale można dodaj „AS” do niego?

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 
+0

To nie działa. – pringlesinn

+0

błąd składni lub po prostu nie zamawia? – digitaljoel

+0

nie rozpoznaje "jako" – pringlesinn