2013-04-30 33 views
9

CẬP NHẬT - xem câu trả lời trong nhận xétJPQL Hibernate NULLS LAST bị bỏ qua

Tôi biết rằng CriteriaQuery.orderBy không hỗ trợ NULLS LAST. Tôi đã cố gắng sử dụng một TypedQuery và nhận thấy rằng nó dường như chỉ cần bỏ qua tất cả mọi thứ sau khi "NULLS LAST" - không ném bất kỳ lỗi nào, chỉ cần bỏ qua nó:

String sql = "SELECT c FROM Contact c WHERE c.partnerCode =:pCode and c.activeFlag='Y'" + 
      " ORDER BY c.primaryFlag DESC NULLS LAST, c.lastName ASC"; 

    TypedQuery<Contact> query = em.createQuery(sql, Contact.class); 
    query.setParameter("pCode", partnerCode);  

    return query.getResultList(); 

này trả về kết quả của tôi đã ra lệnh bởi descendings cờ tiểu học, null đầu tiên, bỏ qua sắp xếp theo họ.

Nếu tôi làm điều này:

 String sql = "SELECT c FROM Contact c WHERE c.partnerCode =:pCode and c.activeFlag='Y'" + 
      " ORDER BY c.primaryFlag DESC, c.lastName ASC"; 

tôi nhận được cả hai loại tiểu học và lastname, nhưng vẫn kết thúc với null đầu tiên bởi vì nó là một Oracle DB.

Tôi gần như ngạc nhiên là không có thông báo lỗi nào được ném khi tôi thêm NULLS LAST và tôi hy vọng rằng với một số chỉnh sửa cú pháp, tôi có thể nhận nó để chấp nhận yêu cầu NULLS LAST.

+0

Một đồng nghiệp cung cấp giải pháp thay thế cho tôi. Vẫn không biết tại sao truy vấn bỏ qua NULLS LAST nhưng tôi đã kết thúc bằng cách sử dụng giải pháp này: Chuỗi sql = "SELECT c FROM Liên hệ c WHERE c.partnerCode =: pCode và c.activeFlag = 'Y'" \t \t + "ORDER BY nvl (c.primaryFlag, 'N') DESC, c.lastName ASC"; Lưu ý: giá trị cho cột là 'Y', 'N' hoặc null. Sử dụng nvl Tôi đang sử dụng 'N' thay cho null. – headlikearock

+0

Bạn nên trả lời câu hỏi của riêng bạn và chấp nhận câu trả lời. – sharakan

+0

Cảm ơn - Tôi nghĩ đó là bài đăng đầu tiên của tôi và tôi không được phép trả lời câu hỏi của riêng tôi vào lúc đó, vì vậy tôi đã thêm nó làm nhận xét thay thế! – headlikearock

Trả lời

2

Một đồng nghiệp cung cấp giải pháp thay thế cho tôi. Vẫn không biết lý do tại sao các truy vấn bỏ qua NULLS LAST nhưng tôi đã kết thúc sử dụng điều này như workaround của tôi:

String sql = "SELECT c FROM Contact c WHERE c.partnerCode =:pCode and c.activeFlag='Y'"    
+" ORDER BY nvl(c.primaryFlag, 'N') DESC, c.lastName ASC"; 

Lưu ý: giá trị cho các cột là 'Y', 'N' hoặc null. Sử dụng nvl Tôi đang sử dụng 'N' thay cho null.