2013-07-24 54 views
0

我試圖創建休眠以下公式:休眠@Formula Case語句

@Formula(value = "case when orderStatus=com.mypackage.model.OrderStatus.REJECTED then 0 else 1 ") 
private int openStatus; 

我得到以下異常:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException :您的SQL語法中有一個 錯誤;檢查對應於您 MySQL服務器版本正確的語法附近 使用手冊「那麼0,否則,1 .OrderStatus.REJECTED作爲formula0_從訂單的C order0_ 爲了」在行1

是否有可能使用公式中的情況?

回答

1

嘗試這種方式寫:

@Formula(value = "case when orderStatus='REJECTED' then 0 else 1 ") 
private int openStatus; 
0

@Formula annotation只有常見的SQL代碼是允許的。當Hibernate查詢數據庫時,公式將作爲子選擇插入。公式的值中不允許使用HQL或Java代碼。

從Hibernate文檔:

可以使用SQL片段(又名式),而不是映射屬性成一列。

假設我們有一個getter註釋這樣的:

@Formula("(SELECT COUNT(*) from t_child c WHERE c.parent_id = parent_id)") 
public int getChildCount() { 
    return childCount; 
} 

Hibernate就會產生這個查詢:

SELECT this_.parent_id      AS parent1_0_1_, 
     this_.name_       AS name2_0_1_, 

     -- Block start 
     (SELECT COUNT(*) 
     FROM t_child c 
     WHERE c.parent_id = this_.parent_id) AS formula0_1_, 
     -- Block end 

     tchild1_.parent_id      AS parent3_3_, 
     tchild1_.child_id      AS child1_3_, 
     tchild1_.child_id      AS child1_1_0_, 
     tchild1_.parent_id      AS parent3_1_0_, 
     tchild1_.name_       AS name2_1_0_ 
FROM test.t_parent this_ 
     LEFT OUTER JOIN test.t_child tchild1_ 
        ON this_.parent_id = tchild1_.parent_id 
WHERE this_.parent_id =? 

我想強調的是由於創建到@Formula註釋塊。希望這有助於理解,Hibernate公式如何工作以及公式需要哪種格式。

1

我認爲你必須在SQL查詢的末尾添加一個「END」。 請嘗試以下操作:

@Formula(value = "case when orderStatus=com.mypackage.model.OrderStatus.REJECTED then 0 else 1 end") 
private int openStatus; 
+0

我可以確認結束'END'是必須的 - 至少對於H2數據庫來說。 – msparer