Hibernate @Formula Case语句

时间:2013-07-24 22:12:05

标签: hibernate case formula

我正在尝试在休眠中创建以下公式:

@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服务器版本为正确的语法使用附近   '.OrderStatus.REJECTED然后0其他1作为公式0从订单order0_   c'在第1行订购

是否可以在公式中使用案例?

3 个答案:

答案 0 :(得分:2)

@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 :(得分:1)

尝试这样写:

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

答案 2 :(得分:1)

我认为你必须添加一个" END"在SQL查询的末尾。 请尝试以下方法:

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