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

SQL-Query の最後に「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 に答える
2

@Formula注釈では、一般的な SQL コードのみが許可されます。Hibernate がデータベースにクエリを実行すると、式が副選択として挿入されます。式の値に HQL または Java コードを使用することはできません。

Hibernate のドキュメントから:

プロパティを列にマッピングする代わりに、SQL フラグメント (式) を使用できます。

次のような注釈が付けられたゲッターがあると仮定します。

@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 に答える