2012-03-12 47 views
5

Cách chạy truy vấn như dưới đây với JPA. (Nó hoạt động với SQL đồng bằng)Truy vấn JPA với CASE WHEN trong mệnh đề WHERE. Làm thế nào để làm gì?

SELECT t 
FROM table t 
WHERE 
    (
    CASE WHEN ((... subquery ...) IS NULL) 
    THEN (t.category IS NULL) 
    ELSE (t.viewId = :viewId) 
    END 
) 

tôi nhận được một MismatchedTokenException tại IS

THEN (t.category IS NULL)

Có thể? Hoặc tôi cần phải viết lại truy vấn này?

+0

Tại sao bạn không phá vỡ tình trạng của mình thành một số điều kiện với AND và OR? –

Trả lời

8

Bạn có thể chuyển đổi của bạn mệnh đề where để cái gì đó như:

where 
    ((... my first condition ...) and (something is NULL)) 
    or 
    (not (... first condition ...) and (something2 = otherthing)) 
2

Tôi nghĩ bạn không thể làm điều đó. Có một đọc của JPQL grammar (ở đây lịch sự của OpenJPA). Dưới đây là các cụm từ xác định biểu thức chữ hoa, cụ thể là cụm từ chữ thường bạn đang sử dụng:

  • case_expression :: = general_case_expression | simple_case_expression | coalesce_expression | nullif_expression
  • general_case_expression :: = TRƯỜNG HỢP when_clause {when_clause} * ELSE scalar_expression END
  • when_clause :: = KHI conditional_expression THEN scalar_expression

Biểu thức ở phía bên tay phải của THEN có phải là một scalar_expression . Đó là để nói:

  • scalar_expression :: = arithmetic_expression | string_primary | enum_primary | datetime_primary | boolean_primary | case_expression | entity_type_expression

Tôi chưa bắt nguồn từ định nghĩa của tất cả các thuật ngữ đó, nhưng tôi nghĩ chúng không bao gồm những thứ như (t.category IS NULL), tôi sợ.

1

Bạn có thể tải JPA 2.0 đặc điểm kỹ thuật phát hành cuối cùng từ đây: http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-eval-oth-JSpec/

Bạn nên kiểm tra Ví dụ 6 trong phần 6.5 .7. Nó cho thấy cách sử dụng case-when trong API tiêu chí. Tôi không chắc chắn, nhưng tôi nghĩ rằng có thể sử dụng các biểu thức logic (t.category IS NULL) trong khối THEN nếu bạn sử dụng nó trong mệnh đề WHERE.

Các vấn đề liên quan