2014-05-05 49 views
0

我有一個名爲查詢:生成正確的SQL與轉換爲NULL轉換器?

<query> 
     select data 
     from objects obj 
     where obj.status = :status 
</query> 

的事情是,狀態是Boolean參數由AttributeConverter的手段轉化爲不是「+」如果狀態trueNULL如果狀態爲false

我做到這一點通過javax.persistence.Converter.AttributeConverter<Boolean, String>

此工作正常,如果狀態是true但如果是false我得到一個錯誤:

Internal Exception: java.sql.SQLSyntaxErrorException: ORA-01722: invalid number

我可以在錯誤日誌中看到生成的SQL查詢包含以下表達式:

(t0.STATUS = ?)

這是不正確的,因爲它實際上應該是:`(t0.STATUS IS NU LL)

我期待爲JPQL如果該值被轉換爲NULL自動生成預期的查詢。有沒有辦法做到這一點,或者是不是以這種方式使用轉換器?

回答

1

您可以嘗試使用NVL:

where nvl(status, 'not_real_value') = nvl(:status, 'not_real_value') 

這種常見的解決方案有幾個問題:

  1. 您必須確保 'not_real_value' 無法happend
  2. 你幾乎退出使用索引(除非你使用函數索引)狀態欄

所以這裏是anoth er解決方案沒有任何妥協:

where ((:status is not null and status = :status) or (status is null and :status is null)) 
+0

雖然這個技巧是可能的,但它正是我試圖避免的。唉,似乎沒有辦法繞過它。 – Roland