我正在尝试在休眠中创建以下公式:
@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行订购
是否可以在公式中使用案例?
答案 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;