2011-10-31 3 views
5

Tôi muốn THỎA THUẬN THEO tuyên bố trường hợp, có thể không? Tôi làm nó như thế nào?ĐẶT HÀNG B "NG "Cột CASE" trong 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 

Trả lời

5

Nhà cung cấp JPA nào bạn đang sử dụng?

Cố gắng,

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 

hay,

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

Tùy chọn thứ hai hoạt động tốt, nhưng phải mất nhiều thời gian hơn chỉ với một CASE. Những gì tôi đã làm là, tôi đã đặt giá trị CASE trong Java, và tôi đã đặt CASE WHEN chỉ trên mệnh đề ORDER BY. Nó hoạt động hoàn hảo và nhanh hơn so với SQL cũ đã được áp dụng. – pringlesinn

+0

chúng ta có thể làm tương tự với thứ tự sắp xếp quá ASC hoặc DESC không? .. Tôi đã thử sử dụng mã này nhưng có mã ASC không mong muốn? –

0

Không có vị trí để kiểm tra ngay bây giờ vì vậy tôi không chắc chắn đây có phải là cú pháp hợp lệ không, nhưng bạn có thể thêm "AS" vào nó không?

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

Nó không làm việc. – pringlesinn

+0

lỗi cú pháp hoặc chỉ không đặt hàng? – digitaljoel

+0

không nhận dạng 'là' – pringlesinn