24

Hibernateを使用しています。sub selectステートメントを使用する必要があるため、ネイティブクエリを作成しました。

クエリは次のようになります。

SELECT sub.rownum FROM 
    (SELECT k.`news_master_id` AS id, @row := @row + 1 AS rownum 
        FROM keyword_news_list k 
        JOIN (SELECT @row := 0) r 
        WHERE k.`keyword_news_id` = :kid
    ORDER BY k.`news_master_id` ASC) AS sub 
WHERE sub.id  = :nid

このクエリを次のように実行すると、次のようになります。

sessionFactory.getCurrentSession()
    .createSQLQuery(query)
    .setParameter("kid", kid)
    .setParameter("nid", nid)
    .uniqueResult();

この例外が発生します:

org.hibernate.QueryException: Space is not allowed after parameter prefix ':' ....

これは、:=オペレーターが原因である可能性があります。私はこれについていくつかの休止状態の問題を見つけました。この問題はまだ未解決です。この問題の解決策はありませんか?

4

7 に答える 7

31

HHH-2697は現在、Hibernate 4.1.3 で修正されていることに注意してください。バックスラッシュでエスケープできるようになりました。

SELECT k.`news_master_id` AS id, @row \:= @row + 1 AS rownum 
    FROM keyword_news_list k 
    JOIN (SELECT @row \:= 0) r 
    WHERE k.`keyword_news_id` = :kid
ORDER BY k.`news_master_id` ASC
于 2012-07-29T13:03:39.237 に答える
19

Hibernate 4.1.3 にジャンプできない私たちのための別の解決策です。クエリ内で
使用するだけです。/*'*/:=/*'*/Hibernate コードは、その間のすべてを'文字列として扱います (無視します)。一方、MySQL は blockquote 内のすべてを無視し、式全体を代入演算子に評価します。
私はそれが速くて汚いことを知っていますが、ストアドプロシージャ、インターセプターなどなしで仕事を終わらせます.

于 2014-08-28T14:58:01.417 に答える
5

これは少し異なる方法で実装できます。: 演算子を別のもの (「|」 char など) に置き換え、インターセプターで「|」を置き換える必要があります。とともに : 。

このように、休止状態は : がパラメーターであると考えようとはしませんが、それを無視します

インターセプターのロジックについては、休止状態のマニュアルを参照してください。

これは、MySQL 5 を使用している私にとってはうまくいきました。

この : の置き換えは、':=' およびその他の MySQL 固有の要件に対してのみ行う必要があることを覚えておいてください。param-placeholders の : を置き換えようとしないでください。(その場合、休止状態はパラメーターを識別できません)

于 2012-02-27T08:23:29.437 に答える
0

私は、Hibernate インターセプターと戦うよりも、Spring JDBC を含めてクエリを実行することを好みます。

于 2013-07-04T16:46:19.183 に答える
0

mysql := operator に遭遇したときのHibernate 例外で、 Stanislavはこの問題を解決するためにインターセプター以外の別のオプションを与えました

于 2015-10-21T07:08:07.120 に答える
-6

= の後にスペースがあってはならないと思います。演算子は =: のように書く必要があります (スペースなし)。

于 2012-02-27T04:42:01.213 に答える