0

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

@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 服务器版本相对应的手册,以在第 1 行的 '.OrderStatus.REJECTED then 0 else 1 as formula0_ from Orders order0_ order by c' 附近使用正确的语法

是否可以在公式中使用大小写?

4

3 回答 3

2

@Formula注释中只允许使用常见的 SQL 代码。当 Hibernate 查询数据库时,公式将作为子选择插入。公式的值中不允许有 HQL 或 Java 代码。

从休眠文档:

您可以使用 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 公式的工作原理以及公式的预期格式。

于 2015-09-09T07:39:11.567 回答
2

我认为您必须在 SQL 查询的末尾添加一个“END”。尝试以下操作:

@Formula(value = "case when orderStatus=com.mypackage.model.OrderStatus.REJECTED then 0 else 1 end")
private int openStatus;
于 2017-01-10T08:14:55.667 回答
1

试着这样写:

@Formula(value = "case when orderStatus='REJECTED' then 0 else 1 ")
private int openStatus;
于 2013-07-24T23:46:42.550 回答